0

メイン ウィンドウに静的コントロールを登録し、テキストを入力したいと考えています。

完全なコードは次のとおりです。

#include <windows.h>
#include "resource.h"
#include <commctrl.h>
void RegisterCommonControls();
#pragma comment(lib, "comctl32.lib")

HINSTANCE hInstance;
HINSTANCE hPrevInstance;
int nCmdShow;

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
            return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
}

LRESULT CALLBACK LblStateProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hWnd, Msg, wParam, lParam);
}

void RegisterCommonControls()
{
    INITCOMMONCONTROLSEX iccex;

    iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    iccex.dwICC  = ICC_TREEVIEW_CLASSES | ICC_LISTVIEW_CLASSES; 
    InitCommonControlsEx(&iccex);
}

bool RegisterWindow(void)
{
    if (hPrevInstance)
        return false;
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = MainWndProc;
    wc.cbClsExtra   = wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.lpszMenuName = MAKEINTRESOURCE(IDC_WIN_API);
    wc.lpszClassName = L"Class1";
    if (!RegisterClass(&wc))
        return false;
    return true;
}

bool RegisterEdit(void)
{
    if (hPrevInstance)
        return false;
    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = LblStateProc;
    wc.cbClsExtra   = wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = wc.hCursor = NULL;
    wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName = NULL;
    wc.lpszClassName = L"STATIC";
    if (!RegisterClass(&wc))
        return false;
    return true;
}

int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    const int size = 600;
    MSG msg;
    RegisterWindow();
    HWND hMainWnd = CreateWindow(L"Class1", L"Main Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, size, size, 0, 0, hPrevInstance, NULL);
    RegisterCommonControls();
    RegisterEdit();
    HWND hLblState = CreateWindow(L"STATIC", L"1", WS_CHILD | WS_VISIBLE | SS_SIMPLE | SS_OWNERDRAW, 200, 200, 100, 50, hMainWnd, 0, NULL, NULL);
    ShowWindow(hMainWnd, nCmdShow);
    UpdateWindow(hMainWnd);
    SendMessage(hLblState, WM_SETTEXT, NULL, (LPARAM)L"Rectangle");
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

そのため、メイン ウィンドウ内に白い「静的」ウィンドウが表示され (コントロールは正しい座標にあります)、内部にテキストはありません (「1」でも「Rectangle」でもありません)。私のコードで何が壊れていますか?

4

1 に答える 1

1

「STATIC」というウィンドウクラスを登録しています。これは、組み込みの「STATIC」ウィンドウクラスよりも優先して使用されるため、ウィンドウは静的コントロールのようには動作しません。

これを修正するには、「STATIC」というウィンドウクラスを登録しないでください。代わりに標準のものが使用されます。

于 2013-02-26T18:25:49.410 に答える