switch( uMessage ){
case WM_COMMAND:
userMenu( hWnd, uMessage, wParam, lParam ) ;
break ;
のuserMenuから派生していった関数のなかで
PICTUREControlの領域に描画をさせたいのですが
その場合はWM_PAINTじゃないとできませんよね??
こういう時ってどうすればいいのでしょうか??
裏画面を作って、そこに描画して、InvalidateRect関数をよぶ。
WM_PAINTでは裏画面の情報をBitBlt転記するだけ。
参考
http://yonex1.cis.ibaraki.ac.jp/~yonekura/lecture02/lecture02e.html#12
再描画というわけでは無く
変数に座標データを入れそれをFor文で回し
DialogのEditControlにその座標データを表示させ,例えばx=50 y=50等.
そして,PICTUREControlにプロットしたいのです.
for(int i=0;i<uEntries;i++){
wsprintf( str, "x=%4d,y=%4d", pPage->x, pPage->y); SetDlgItemText(hwnd, IDD_COUNT3, str );
pPage++;
}
でデータ表示だけはなんとかできる状態です.
なら単にGetDCしてそこに描画するだけなのでは?
裏画面を使わないと再表示時にすべて初期化されますけど。
HDC hdc;
HWND hCtrl;
hCtrl= GetDlgItem(hwnd,IDC_PICTURE);
hdc= GetDC(hCtrl);
for(int i=0;i<uEntries;i++){
wsprintf( str, "x=%4d,y=%4d", pPage->x, pPage->y);
SetDlgItemText(hwnd, IDD_COUNT3, str );
SetPixel(hdc,pPage->x,pPage->y,RGB(0,255,255));
pPage++;
}
ReleaseDC(hCtrl,hdc);
でやってるのですが,データ表示だけでプロットはされない状態です.
特に悪くはないと思うけどなんだろね。
IDC_PICTUREはやめてダイアログに書ける?
x,yがすごい大きな値とか。
いまさらですが、これまでの経緯です。
http://m--takahashi.com/bbs/default.aspx?c=14307
# 俺は手を引きます。
<wclrpサン
ダイアログへの出力の仕方がわからないです.
x,yの値が3000やら8000だったので1/100にしてみましたが無理でした.
<シャノンサン
すいません.
いままでありがとうございました.
HDC hdc;
HWND hCtrl;
hCtrl= GetDlgItem(hwnd,IDC_PICTURE);
hdc= GetDC(hCtrl);
for(int i=0;i<uEntries;i++){
wsprintf( str, "x=%4d,y=%4d", pPage->x, pPage->y);
SetDlgItemText(hwnd, IDD_COUNT3, str );
SetPixel(hdc,pPage->x,pPage->y,RGB(0,255,255));
pPage++;
}
ReleaseDC(hCtrl,hdc);
をWM_PAINTに移動。
WM_COMMAND内の上記部分はInvalidateもしくはInvalidateRectに差し替え。
…でいかないですかね。
IDC_PICTUREのWM_PAINTが走ったら消されるかな?
私はBlueさんのように裏ビットマップ作ってるけど
(&IDC_PICTUREを派生クラスにしてその中のWM_PAINTで転送)。
IDC_PICTUREのWM_PAINTが走ったら消されるさ。
ダイアログならば子ウィンドウや兄弟ウィンドウへの描画も
可能な設定のことが多いから
ダイアログの再描画で消してしまうこともある。
<みいサン
WM_PAINTに移動すると今度はpPage等が取得できなくなります.
pPageの定義部分も移動してきたのですが読み取りエラーみたいなのが出て動かないです.
<wclrpサン
ダイアログに直接プロットするのにはどうすればいいのでしょうか??
とりあえず何でもいいから座標データをプロットし図で表したいんです.
>> wclrp ( 'o')さんへ
あははは。やっぱり。
FIGさんが実際にやってみてちらっとでも表示されたら
ヒントになるかと思ったのですが。
>> FIGさんへ
> pPageの定義部分も移動してきたのですが
pPageへの値セットは行っているのでしょうか。
ちなみにGetDCについてヘルプ見るなり調べるなり
したことありますか?
⇒みいサン
左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
というエラーが出てきます.
GetDCはコンテキストを取得するものじゃありませんでしたっけ??
詳しいことはわからないです.
HDC hdc;
HWND hCtrl;
RECT rc;
hCtrl= GetDlgItem(hwnd,IDC_PICTURE);
GetWindowRect(hCtrl,&rc);
hdc= GetDC(hCtrl);
Rectangle( hdc, 0, 0, 334, 463 );
for(int i=0;i<uEntries;i++){
wsprintf( str, "x=%4d,y=%4d", (pPage->x)/50, (pPage->y)/50);
SetDlgItemText(hwnd, IDD_COUNT3, str );
SetPixelV(hdc,pPage->x,pPage->y,RGB(0,255,255));
UpdateWindow(hwnd);
pPage++;
}
ReleaseDC(hCtrl,hdc);
のようにしたところ,四角は描かれるようになりましたが
やはりデータはプロットされません・・・どうすればよいでしょうか??
> wsprintf( str, "x=%4d,y=%4d", (pPage->x)/50, (pPage->y)/50);
> SetPixelV(hdc,pPage->x,pPage->y,RGB(0,255,255));
pPage->x,pPage->y が IDC_PICTURE の領域外の座標なので表示されなかった。
でFAという雰囲気がかなりするなぁ…
番外として
・SetPixelV()で打たれる点のサイズは1x1ピクセルなので小さ過ぎて気付かなかった
・SetPixelV()で打たれる点の色と IDC_PICTURE の色が似ていたので気付かなかった
とりあえず、先の意見でもでているように画面への描画処理は WM_PAINT 辺りで行うべきだね。
こんなトコで描画処理をしてもウィンドウ再描画が掛かれば全て消えちゃうから。
他の人にも言われてると思うけど、
・任意の座標に描画できるか
・正しいデータを用意できるのか
は別問題。それをごちゃ混ぜにしてるからいつまでたっても解決しない。
例えばまずは640*480の範囲に正しく点や線が書けるか試してみる。
それができたら次は入力データを640*480の範囲に補正できるかやってみる。
両方できたら後はその2つの処理を結合させるだけ。
一応補足しとくけど、
>・任意の座標に描画できるか
というのは、一瞬だけ出たとか、図形の一部だけ出た…では駄目だよ。専用に用意したテストデータを完璧に表示できるとこまでしないと駄目。
ウィンドウを動かそうが、サイズ変更しようが、最小化して元にもどそうが何をしてもちゃんと表示できるまでね。
皆さんの言う通り,データが領域外を示していました.
> wsprintf( str, "x=%4d,y=%4d", (pPage->x)/50, (pPage->y)/50);
> SetPixelV(hdc,pPage->x,pPage->y,RGB(0,255,255));
で表示では/50しておりプロットの所では忘れてました.
//データ表示
HDC hdc;
HWND hCtrl;
RECT rc;
hCtrl= GetDlgItem(hwnd,IDC_PICTURE);
GetWindowRect(hCtrl,&rc);
hdc= GetDC(hCtrl);
//Rectangle( hdc, 0, 0, 334, 463 );
for(int i=0;i<uEntries;i++){
wsprintf( str, "x=%4d,y=%4d", (pPage->x), (pPage->y));
SetDlgItemText(hwnd, IDD_COUNT3, str );
SetPixelV(hdc,(pPage->x)/20+120,(pPage->y)/20+130,RGB(0,0,0));
UpdateWindow(hwnd);
pPage++;
}
ReleaseDC(hCtrl,hdc);
//ここまで
としたら無事に表示することができました.
力不足な私に多大な時間を割いていただきありがとうございました.
ツイート | ![]() |