WideStudio memo

トップに戻る  休憩所 
WideStudioで開発するときのためにメモを残しておきます。

FILE: F:/wswk/test/TestWin.cppの出力に失敗しました。出力を続けますか?(v3.97-12)

ビルドオールなどmakeするとき上記のようなmessageダイアログが出ることがあります。
eclipseでプロジェクトを扱った後にBuilderでmakeし直すときに発生するようです。

プロジェクトを終了して、プロジェクトフォルダをサブディレクトリを含めて読み取り専用にして
再び、プロジェクトフォルダをサブディレクトリを含めて読み取り専用を解除する。
こうするとうまくいくようです。

cannot open output file XXXXXX.exe: Permission denied(v3.97-12)

makeする対象のEXEファイルが実行中のときmakeエラーになります。
実行中のアプリケーションを終了させてからmakeし直せば良い。

複数のWindowの表示優先順位が変わるようにする(v3.97-12)

メインウィンドウの子ウィンドウとしてWSCwindowをぶら下げた場合、メインウィンドウを
その子ウィンドウよりも上に持ってくる方法が見当たりません。

メインウィンドウ以外のウィンドウも新規ウィンドウとして作成しWSCmainWindowにすれば良い。
このようにすればメインウィンドウをマウスでクリックしたときなどに他のウィンドウより上に
持ってくることができます。

メインウィンドウ以外のウィンドウのWSNexitプロパティをオフにしておくとメインウィンドウ以外の
ウィンドウを閉じてもアプリケーションが終了しないようにすることができます。

Windowの一部だけ描画する方法(v3.97-12)

例えば、WSCvdrawingAreaに描画する通常の方法はredraw()を使うなどして全体を描画し直します。
これではWSCvdrawingAreaのサイズが大きいとちらつきが激しくなります。

Windowの一部だけ表示する方法はいくつか用意されているようですが、そのうちの1つに
WSDdevを使う方法があります。
WSCvdrawingAreaからgetdev()を使ってWSDdevを取得します。
WSCvdrawingAreaからgetProperty(WSNy)、getProperty(WSNy)を使ってWSCvdrawingAreaの相対位置を取得します。
WSCvdrawingAreaからgetProperty(WSNwidth)、getProperty(WSNheight)を使ってWSCvdrawingAreaのサイズを取得します。
取得したWSDdevからbeginDraw()を使って相対位置やサイズをセットして描画を開始します。
描画したいエリアをWSDdevからsetRegion()を使ってセットします。座標はWSCvdrawingAreaの座標になります。
WSCvdrawingAreaに描画すると同じようにWSDdevに描画します。
WSCvdrawingAreaとWSDdevとでsetForeColorなどいくつか違いがあります。
setForeColor("#ffffff")はsetForeColor(WSGIappColorSet()->getColorNo("#ffffff"))とします。
描画したいことが終わったらWSDdevからendDraw()を使って描画の終了をセットします。

WSDmwindowDevを使って描画した画像をコピーするほうが汎用性があるかもしれません。

補足:上記方法の場合WSCvdrawingAreaのプロパティWSNusePixmapを無にしないと誤動作するようです。
補足:WSDmwindowDevを使って描画した画像をコピーする方法のほうが複雑な処理でも簡単に実装できます。

WSCvfbtnでonMouseOutを使う(v3.97-12)

WSCvfbtn上にマウスカーソルが乗っかっているとき、WSCvfbtnが浮き上がった表示になります。
マウスでクリックした後でも、WSCvfbtnは浮き上がった表示のままです。
マウスをクリックして操作不可の状態にすると、WSCvfbtnは浮き上がった表示のまま操作不可となり
マウスを範囲外に移動してもWSCvfbtnは浮き上がった表示のままとなっています。

ボタンを選択した直後にボタンを操作不可とするような場合、
例えば、ACTIVEトリガやMOUSE-PRESSトリガの中でWSCvfbtnからonMouseOut()をしておけば良いようです。
なお、WSCvfbtnを操作不可とする方法はsetSensitive(False)などがあります。

setPropertyでEXPOSEが発生(v3.97-12)

Windowのタイトルバーの文字列を変更しようとしてsetProperty()を実行させると
Window全体をEXPOSEさせているようで、Window全体がちらついてしまうことがあります。
redrawさせたくないような場合はタイトルバーに状況を表示する方法を断念し
ウィンドウ内に状況を表示させる方法を検討する必要があるかもしれない。

アプリケーション終了処理(v3.98-1b1)

WSCmainWindowのEXITトリガで終了処理を記述します。
//インスタンスを表示しなおすタイマープロシージャ
void delayproc(unsigned char,void* ptr) {
	WSCbase* object = (WSCbase*)ptr;
	object->setVisible(True);
}

//EXITプロシージャ(プロシージャ名MainWin_Exit_ep、起動関数名MainWin_Exitの場合)
void MainWin_Exit(WSCbase* object) {

	//マルチスレッドの場合ここにスレッド終了処理

	if (object->getVisible() != False) {
		return;
	}

	//必要ならここでウインドウの位置サイズなどをファイルなどに保存

	if (保存すべきデータがあるなら) {
		WSCmessageDialog* msg = WSGIappMessageDialog();
		msg->setProperty(WSNwidth,500);
		msg->setProperty(WSNno,True);
		msg->setProperty(WSNdefaultPosition,True);
		msg->setProperty(WSNokString, "はい");
		msg->setProperty(WSNnoString, "いいえ");
		msg->setProperty(WSNcancelString, "キャンセル");
		msg->setProperty(WSNlabelString,
			"セーブして終了しますか?\n セーブしないで終了する場合は「いいえ」を選択してください。");
		//ダイアログの表示
		long ret = msg->popup();
		if (ret == WS_DIALOG_OK) {
			//saving some data ...
			exit(0);
		} else if (ret == WS_DIALOG_NO) {
			exit(0);
		} else if (ret == WS_DIALOG_CANCEL) {
			WSGIappTimer()->addTriggerProc(delayproc,WS250MS,object);
		}
	} else {
		exit(0);
	}
}
static WSCfunctionRegister  op("MainWin_Exit",(void*)MainWin_Exit);
ウインドウのメニューに終了メニューを追加する。
メニュープロシージャ内でグローバルなWSCmainWindowにアクセスする。
#include <WSCmainWindow.h>
extern WSCmainWindow* MainWin;

//NONEプロシージャ(プロシージャ名MainWin_FileExit_ep、起動関数名MainWin_FileExitの場合)
void MainWin_FileExit(WSCbase* object){
	MainWin->setVisible(False);
	MainWin->execProcedure("MainWin_Exit_ep");
}
static WSCfunctionRegister  op("MainWin_FileExit",(void*)MainWin_FileExit);

スレッドの制御(これは文章にまとめられないかも・・・)
タイマーを利用した連続ステップ動作
擬似スピン付きエディットボックス
トップに戻る