1

メイン ウィンドウにリストビューがある Win32++ アプリケーションで作業しています。これは私のコードです:

HWND CarsListView = NULL;

switch (message)
{
case WM_SHOWWINDOW:
    CarsListView = CreateListView(hWnd);
    ShowWindow(CarsListView, SW_SHOW);
    break;
case WM_SIZING:
    {
        if(!CarsListView)
            MessageBox(hWnd, _T("Null handle."), _T("Error"), MB_ICONERROR | MB_OK);
        RECT WindowRect;
        GetWindowRect( hWnd, &WindowRect);
        SetWindowPos(CarsListView, NULL, 0, 0, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top, SWP_SHOWWINDOW); 
    }
    break;
// ...
}

CreateListView定義は次のとおりです。

HWND CreateListView (HWND hwndParent) 
{ 
  INITCOMMONCONTROLSEX icex;           // Structure for control initialization.
  icex.dwICC = ICC_LISTVIEW_CLASSES;
  InitCommonControlsEx(&icex);

  RECT rcClient;                       // The parent window's client area.

  GetClientRect (hwndParent, &rcClient); 

  // Create the list-view window in report view with label editing enabled.
  HWND hWndListView = CreateWindow(WC_LISTVIEW, 
    L"",
    WS_CHILD | LVS_REPORT | LVS_EDITLABELS,
    0, 0,
    rcClient.right - rcClient.left,
    rcClient.bottom - rcClient.top,
    hwndParent,
    /*(HMENU)*/NULL,
    hInst,
    NULL); 
  return (hWndListView);
}

ウィンドウが を受け取るWM_SIZINGと、それが得られますCarsListView = NULL

そのハンドルがリストビューを指すようにするにはどうすればよいですか?

4

3 に答える 3

1

WM_SHOWWINDOW ではなく、WM_CREATE でリストビューを作成します。また、ハンドルをグローバルまたは静的にします。

または、リスト ビューをグローバルに作成して非表示のままにして、必要なときにいつでも表示して位置を設定することもできます。

于 2013-09-05T08:41:11.040 に答える
1

そのようなことを行うための 3 つの方法。

  1. CarsListView
    HWND を に保存しますstatic。親ウィンドウのインスタンスを 2 つ持つことはできません。
  2. 必要に応じて、init および GetWindowLongPtr での不適切な使用
    SetWindowsLongPtr(parentHWND,GWLP_USERDATA,CarsListViewHWND)必要な数のインスタンスを持つことができるのは高速ですが、複数の情報が必要な場合はstruct、将来の拡張性のために単一の HWND ではなく、HWND を内部に格納することをお勧めします。
  3. いいもの ?
    はるかに多くのコードを使用SetProp(parentHWND,"Your Unique String",hDataHandle);しますが、その使用法では、USERDATA が既に使用されているかどうかを気にせずに、すべてのウィンドウで使用できます。個人のプロパティをウィンドウ/コードに追加する必要がある場合、それがどのように使用されるか、時間の経過とともに変化するかがわからない場合に最適な方法です。
于 2013-09-05T08:47:34.303 に答える
1

これには、「良い」方法と「悪い」方法の 2 つの方法があります。

  • 「悪い」方法は、単にローカル変数を として宣言するstaticことですが、同じプロセスでこのタイプのウィンドウを 2 つ作成することはできません。
  • 「良い」方法は、ヒープ割り当て構造体に記憶し、この構造体へのポインタを SetWindowLongPtr() を使用して Window 情報に格納することです。その後、GetWindowLongPtr() を使用してこの構造を取得できます。
于 2013-09-05T08:31:40.347 に答える