WM_COMMAND内でWM_PAINTを使う

解決


FIG  2007-10-27 01:32:33  No: 66663

switch( uMessage ){
      case WM_COMMAND:
      userMenu( hWnd, uMessage, wParam, lParam ) ;
      break ;

のuserMenuから派生していった関数のなかで
PICTUREControlの領域に描画をさせたいのですが
その場合はWM_PAINTじゃないとできませんよね??

こういう時ってどうすればいいのでしょうか??


Blue  2007-10-27 01:47:37  No: 66664

裏画面を作って、そこに描画して、InvalidateRect関数をよぶ。
WM_PAINTでは裏画面の情報をBitBlt転記するだけ。

参考
http://yonex1.cis.ibaraki.ac.jp/~yonekura/lecture02/lecture02e.html#12


FIG  2007-10-27 02:07:46  No: 66665

再描画というわけでは無く
変数に座標データを入れそれを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++;
    } 

でデータ表示だけはなんとかできる状態です.


Blue  2007-10-27 02:41:57  No: 66666

なら単にGetDCしてそこに描画するだけなのでは?
裏画面を使わないと再表示時にすべて初期化されますけど。


FIG  2007-10-30 00:19:59  No: 66667

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);

でやってるのですが,データ表示だけでプロットはされない状態です.


wclrp ( 'o')  2007-10-30 09:05:45  No: 66668

特に悪くはないと思うけどなんだろね。
IDC_PICTUREはやめてダイアログに書ける?
x,yがすごい大きな値とか。


シャノン  2007-10-30 22:27:59  No: 66669

いまさらですが、これまでの経緯です。
http://m--takahashi.com/bbs/default.aspx?c=14307

# 俺は手を引きます。


FIG  2007-10-30 23:14:55  No: 66670

<wclrpサン
ダイアログへの出力の仕方がわからないです.
x,yの値が3000やら8000だったので1/100にしてみましたが無理でした.

<シャノンサン
すいません.
いままでありがとうございました.


みい  2007-10-31 05:28:18  No: 66671

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で転送)。


wclrp ( 'o')  2007-10-31 17:05:33  No: 66672

IDC_PICTUREのWM_PAINTが走ったら消されるさ。
ダイアログならば子ウィンドウや兄弟ウィンドウへの描画も
可能な設定のことが多いから
ダイアログの再描画で消してしまうこともある。


FIG  2007-11-01 22:35:36  No: 66673

<みいサン
WM_PAINTに移動すると今度はpPage等が取得できなくなります.
pPageの定義部分も移動してきたのですが読み取りエラーみたいなのが出て動かないです.

<wclrpサン
ダイアログに直接プロットするのにはどうすればいいのでしょうか??

とりあえず何でもいいから座標データをプロットし図で表したいんです.


みい  2007-11-02 05:01:11  No: 66674

>> wclrp ( 'o')さんへ
あははは。やっぱり。
FIGさんが実際にやってみてちらっとでも表示されたら
ヒントになるかと思ったのですが。

>> FIGさんへ
> pPageの定義部分も移動してきたのですが
pPageへの値セットは行っているのでしょうか。

ちなみにGetDCについてヘルプ見るなり調べるなり
したことありますか?


FIG  2007-11-02 23:11:09  No: 66675

⇒みいサン
左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。
というエラーが出てきます.  

GetDCはコンテキストを取得するものじゃありませんでしたっけ??
詳しいことはわからないです.


FIG  2007-11-06 22:31:12  No: 66676

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); 
    

のようにしたところ,四角は描かれるようになりましたが
やはりデータはプロットされません・・・どうすればよいでしょうか??


gak  2007-11-07 01:37:43  No: 66677

> 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 辺りで行うべきだね。
こんなトコで描画処理をしてもウィンドウ再描画が掛かれば全て消えちゃうから。


ぷにゅ  2007-11-07 11:25:28  No: 66678

他の人にも言われてると思うけど、
・任意の座標に描画できるか
・正しいデータを用意できるのか
は別問題。それをごちゃ混ぜにしてるからいつまでたっても解決しない。

例えばまずは640*480の範囲に正しく点や線が書けるか試してみる。
それができたら次は入力データを640*480の範囲に補正できるかやってみる。

両方できたら後はその2つの処理を結合させるだけ。


ぷにゅ  2007-11-07 11:59:49  No: 66679

一応補足しとくけど、
>・任意の座標に描画できるか
というのは、一瞬だけ出たとか、図形の一部だけ出た…では駄目だよ。専用に用意したテストデータを完璧に表示できるとこまでしないと駄目。
ウィンドウを動かそうが、サイズ変更しようが、最小化して元にもどそうが何をしてもちゃんと表示できるまでね。


FIG  2007-11-08 00:18:33  No: 66680

皆さんの言う通り,データが領域外を示していました.
> 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); 
    
//ここまで

としたら無事に表示することができました.
力不足な私に多大な時間を割いていただきありがとうございました.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加