3

非常に基本的なサンプル Win32 アプリケーションをダウンロードし、それにツリー ビューを追加したいと考えています。これが現時点での私の WinMain です。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = NULL;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = NULL;

    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "My Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&Msg, NULL, 0, 0) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

通常のウィンドウと同じように機能します。

ツリー ビューの作成に関する多くのページを読みましたが、私のような初心者にはわかりません。CreateWindowEx 関数のクラスを WC_TREEVIEW に変更したので、WinMain は次のようになりました。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = NULL;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = NULL;

    /*if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }*/

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        /*g_szClassName*/WC_TREEVIEW,
        "My Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&Msg, NULL, 0, 0) > 0) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

問題は、ウィンドウが Windows テーマに読み込まれず、閉じるボタンが異なって見えることです。また、メニューが表示されません。

ツリー ビューを作成するコードは次のとおりです (ツリー ビューは表示されません)。

struct treeView {
    HWND hwnd;
    TV_INSERTSTRUCT insert;
    HTREEITEM parent;
    HTREEITEM before;
    HTREEITEM root;
};

case WM_CREATE:
{
    struct treeView resourcesTreeView;

    resourcesTreeView.hwnd = GetDlgItem(hwnd, ID_RESOURCES_TREE_VIEW);
    resourcesTreeView.insert.hParent = NULL;
    resourcesTreeView.insert.hInsertAfter = TVI_ROOT;
    resourcesTreeView.insert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
resourcesTreeView.insert.item.pszText = "Parent";
    resourcesTreeView.insert.item.iImage = 0;
    resourcesTreeView.insert.item.iSelectedImage = 1;
    resourcesTreeView.parent = (HTREEITEM)SendDlgItemMessage(hwnd, ID_RESOURCES_TREE_VIEW, TVM_INSERTITEM, 0, (LPARAM)&resourcesTreeView.insert);
    resourcesTreeView.root = resourcesTreeView.parent;
    resourcesTreeView.before = resourcesTreeView.parent;
    UpdateWindow(hwnd);
}

以下を含めるようにしました。

case WM_INITDIALOG:
{
    /*INITCOMMONCONTROLSEX icc;
    icc.dwSize = sizeof(icc);
    icc.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icc);*/
    InitCommonControls();
}
4

1 に答える 1

3

WM_INITDIALOGダイアログにのみ送信されますが、ウィンドウを手動で作成しています。ツリー コントロールを作成する前InitCommonControls()に、関数に呼び出しを配置する必要があります。WinMain()

ツリーのようなコントロールは、あなたがしようとしているトップレベルのウィンドウとしてうまく機能しません。ウィンドウ クラスを元の状態に戻して、ウィンドウが機能するようにし、 への呼び出しのShowWindow()に次を追加します。

RECT rc;
GetClientRect(hwnd, &rc);

HWND hwndTree = CreateWindowEx(
    WS_EX_CLIENTEDGE,
    WC_TREEVIEW,
    0,
    WS_CHILD | WS_VISIBLE,
    0, 0, rc.right, rc.bottom,
    hwnd, NULL, hInstance, NULL);

これにより、トップレベル ウィンドウの子としてツリー コントロールが表示されます。その後、 にメッセージを送信して、項目を追加して遊んでみることができますhwndTree

于 2013-10-10T18:30:48.830 に答える