EnumWindowsをコマンドボタンでリストアップ


向日葵  2003-05-22 06:26:33  No: 51437

向日葵です、お世話になります。

EnumWindowsにて取得と同時にリストボックスへ
追加するというものはできたのですが、
これを同ウインドウ上のコマンドボタンの
クリックイベントにてリストアップを行うには
どうすれば良いのでしょうか?

ちなみに、順次グローバルは配列へ格納してゆきたいと思っています。

COMMANDによって関数を呼び出しそこからリストボックスへ
SendMessageを送信したいのですが、この時、
リストボックスのハンドルをどのようにGetすれば良いでしょうか?

関数へ引数としてリストボックスのハンドルを渡すのでしょうか?

ウインドウ上の特定のコントロールのハンドルを取得する方法があるの
でしょうか?

何れもどうするべきかその方法が分かりません、
どうぞ宜しくお願いします。


YuO  2003-05-22 07:54:33  No: 51438

> COMMANDによって関数を呼び出しそこからリストボックスへ
> SendMessageを送信したいのですが、この時、
> リストボックスのハンドルをどのようにGetすれば良いでしょうか?
> 関数へ引数としてリストボックスのハンドルを渡すのでしょうか?

そういうことになります。
大域変数という方法もありますが。

> ウインドウ上の特定のコントロールのハンドルを取得する方法があるの
> でしょうか?

リストボックスにIDを振ってあるなら,
GetDlgItemやSendDlgItemMessageが使えます。

IDが無いなら,FindWindowExやEnumChildWindowsなどを使って検索するしかないです。


向日葵  2003-05-22 20:03:02  No: 51439

YuOさん、いつもお世話になっております。

ウインドウプロシージャにて
WM_CREATE
  //リストボックス作成
  hList = CreateWindow(TEXT("LISTBOX"), , , , , , ,hWnd,(HMENU)1,,);

WM_COMMAND  
  case 1:
    SendMessage(hList , LB_RESETCONTENT , 0 , 0); //初期化
    ListUP((LPARAM) hList); //関数呼出し
    break;

  case 2:
    //EnumWindowsの呼び出しで
    //StrWindowBuf[]にウインドウキャプションを取得
    break;

リストアップ関数
void ListUP(LPARAM lParam){
  For(i=0;i++;10){
    SendMessage((HWND)lParam , LB_ADDSTRING , 0 , (long)StrWindowBuf[i]);
  }
}

のように、見よう見真似てリストボックスのハンドルを渡してあげることでできました。

ただ、コマンドボタンのボタンのクリックに応じてリスト
ボックスの再描写はこのような方法で良いのでしょうか?

WinMainにおいてCreateWindowでリストボックスを作成して、
コマンドボタンのクリックによってリストボックスの再描写とか
できるのでしょうか?

static HWND hList;
と宣言してあげると
SendMessage(hList, LB_ADDSTRING , 0 , (long)StrWindowBuf[i]);
のようにもできましたが、コントロールのウンドウハンドルを
Static宣言するのは良くはないですよね?

また、GetDlgItemを使う場合
SendMessage((HWND)GetDlgItem(hwnd ,1),LB_ADDSTRING,0,(long)StrWindowBuf[i]);
この場合、リストボックスのIDが1となりますよね?
そこで、ダイアログのハンドルhwndをどうすれば良いのかがわかりませんでした。
リストボックスが置かれている親ウインドウのハンドルがこれに当たるのでしょうか?
だとすると、これはどのように渡せば良いのでしょうか?

重ね重ね、宜しくお願いします。


YuO  2003-05-23 08:28:04  No: 51440

> hList = CreateWindow(TEXT("LISTBOX"), , , , , , ,hWnd,(HMENU)1,,);
> WM_COMMAND 
> case 1:
> SendMessage(hList , LB_RESETCONTENT , 0 , 0); //初期化
> ListUP((LPARAM) hList); //関数呼出し
> break;

ん?
ID : 1はリストボックスですが……。

> リストアップ関数
> void ListUP(LPARAM lParam){

void ListUP(HWND hList){
のように,ウィンドウハンドルを直接渡した方が安全です。

> static HWND hList;
> と宣言してあげると
> SendMessage(hList, LB_ADDSTRING , 0 , (long)StrWindowBuf[i]);
> のようにもできましたが、コントロールのウンドウハンドルを
> Static宣言するのは良くはないですよね?

時と場合によりけりです。
場合によっては,staticの方が良い場合もあります。

> また、GetDlgItemを使う場合
> SendMessage((HWND)GetDlgItem(hwnd ,1),LB_ADDSTRING,0,(long)StrWindowBuf[i]);
> この場合、リストボックスのIDが1となりますよね?
> そこで、ダイアログのハンドルhwndをどうすれば良いのかがわかりませんでした。
> リストボックスが置かれている親ウインドウのハンドルがこれに当たるのでしょうか?

え〜っと,MSDNを読みましょう。
http://msdn.microsoft.com/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxFunctions/GetDlgItem.asp

Remarkの最初に,
>You can use the GetDlgItem function with any parent-child window pair, not just with dialog boxes.
と書いてあります。

でもって,これは
SendDlgItemMessage(hWnd, 1, LB_ADDSTRING, 0, (LPARAM)StrWindowBuf[i]);
となります。

> だとすると、これはどのように渡せば良いのでしょうか?

普通に引数として渡せばよいです。


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

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






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