6

私は複数のサイト、ドキュメント、チュートリアルを調べてきましたが、それらはすべて同じことを言っています。つまり、コントロールは Win32 の API のウィンドウにすぎないため、CreateWindowExW()関数を使用ListBoxしてメイン上にコントロール/ウィンドウを作成できます。アプリケーション ウィンドウ。

すべてのコントロールが異なるdwStyleを持つウィンドウであるという概念は理解できますが、コントロールをインスタンス化する方法、つまりコントロールの方法を見つけるのに苦労していますListBox

LISTBOX次のように、ダイアログがその宣言で指定されているように記述されているチュートリアルに遭遇しました。

// resource.h
#define IDD_MAIN                        101
#define IDC_TEXT                        1000
#define IDC_NUMBER                      1001
#define IDC_LIST                        1002
#define IDC_ADD                         1003
#define IDC_CLEAR                       1004
#define IDC_REMOVE                      1005
#define IDC_SHOWCOUNT                   1006

// .rc resource file
IDD_MAIN DIALOG DISCARDABLE  0, 0, 207, 156
    STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Controls One"
    FONT 8, "MS Sans Serif"
BEGIN
    LTEXT           "Add",IDC_STATIC,7,10,14,8
    EDITTEXT        IDC_TEXT,25,7,120,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_NUMBER,150,7,21,14,ES_NUMBER
    LTEXT           "times.",IDC_STATIC,177,10,23,8
    LISTBOX         IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT | 
                    LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON      "&Add",IDC_ADD,150,30,50,14
    PUSHBUTTON      "&Remove",IDC_REMOVE,150,47,50,14
    PUSHBUTTON      "&Clear",IDC_CLEAR,150,63,50,14
    LTEXT           "This item was added",IDC_STATIC,7,141,66,8
    CTEXT           "-",IDC_SHOWCOUNT,77,141,32,8
    LTEXT           "times",IDC_STATIC,114,141,17,8
END

そして、彼の C プログラムで次のように使用します。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}

これで、概念を完全に理解できるようになりました。ListBox余談ですが、コントロールを追加するメイン アプリケーション ウィンドウを作成および設計できるようにしたいと考えています。このチュートリアルの例では、CreateWindowExW()関数を使用してコントロールを作成するのではなく、実際にメイン アプリケーション ウィンドウとなるダイアログを作成します。

1 -コードでメイン ウィンドウにコントロールを追加する方法についての手がかりはありますか?ListBox

WM_CREATEメッセージを処理しながら作成することを考えました。

2 -これは良い考えですか?

3 -このシナリオでのベスト プラクティス/アプローチは何ですか?

4

2 に答える 2

11

Win32 でコントロールを動的に作成するには、次のコードが必要です。

HWND hBtn, hLabel, hListbox, hTextBox;

void InitializeComponent(HWND hWnd) {
    HINSTANCE hInstance = GetModuleHandle(NULL);

    // Adding a Button.
    hBtn = CreateWindowExW(WS_EX_APPWINDOW,
        L"BUTTON", NULL,
        WS_CHILD | WS_VISIBLE,
        327, 7, 70, 21,
        hWnd, NULL, hInstance, NULL);        

    SetWindowTextW(hBtn, L"&Button");

    // Adding a Label.
    hLabel = CreateWindowExW(WS_EX_CLIENTEDGE,
        L"STATIC", NULL,
        WS_CHILD | WS_VISIBLE,
        7, 7, 50, 21,
        hWnd, NULL, hInstance, NULL);

    SetWindowTextW(hLabel, L"Label:");

    // Adding a ListBox.
    hListBox = CreateWindowExW(WS_EX_CLIENTEDGE,
        L"LISTBOX", NULL,
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL,
        7, 35, 300, 200,
        hWnd, NULL, hInstance, NULL);

    // Adding a TextBox.
    hTextBox = CreateWindowExW(WS_EX_CLIENTEDGE,
        L"EDIT", NULL,
        WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL,
        62, 7, 245, 21,
        hWnd, NULL, hInstance, NULL);

    SetWindowTextW(hTextBox, L"Input text here...");
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
    switch (Msg) {
        case WM_CREATE:
            InitializeComponent(hWnd);
            break;            
        default:
            return DefWindowProcW(hWnd, Msg, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
    // Declaring, defining, registering and creating window here...
    // Note that each Window/Control has to have its own Message handling function.
}
于 2010-12-17T20:52:20.150 に答える