簡體   English   中英

Win32 Combobox,打印所選的名稱以編輯文本框

[英]Win32 Combobox, print the name of selected to edit text box

我正在為win32測試Combobox的理論。 已經嘗試了很多東西,但我不知道如何讓它做我想做的事。 當在組合框中進行選擇時,我希望它打印到編輯框中。 我相信這可以通過手柄完成。

所以,如果我通過按鈕1的演員表將它添加到我的按鈕1,你如何將它打印到編輯字段?

我的代碼如下。 我留下了一些我嘗試過的東西但是對它進行了評論。 問題是添加控件,我在想我的開關和案例。

我錯過了一個將文本填充到編輯框的部分。

對於這種類型的編程而言,我對編程並不是一個新手。 我正在尋找一種簡單的方法。 在此先感謝您的時間。

下面是更新的代碼和我現在得到的內容。 我遵循unicode指南。 我甚至和visual studio c ++結交了朋友(我想)。

#include <windows.h>
#include <tchar.h>
#include <iostream>

using namespace std;

#define OPTINBT1 1
#define OPTINBT2 2
#define COMBO1 3

HWND hWnd, hComboOne;

void addControl(HWND);

LPCWSTR egClassName = L"myWindowClass";

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR args, int nCmdShow)
{

    WNDCLASSW wc = { 0 };

    wc.lpszClassName = egClassName;
    wc.lpfnWndProc = WindowProcedure;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);

    if (!RegisterClassW(&wc))
    {
        const wchar_t  Error01[] = L"Register Issue To Check On : ";
        const wchar_t  Error01_Caption[] = L"Error 01";

        MessageBoxW(hWnd, Error01, Error01_Caption, MB_OK | MB_ICONERROR);

        return 0;
    }

    LPCWSTR parentWinTitle = L"My Window";

    hWnd = CreateWindowW(egClassName, parentWinTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, NULL, NULL, NULL, NULL);

    if (hWnd == NULL)
    {

        const wchar_t Error02[] = L"Window Creation Issue To Check On : ";
        const wchar_t Error02_Caption[] = L"Window Creation Issue To Check On : ";
        MessageBoxW(hWnd, Error02, Error02_Caption, MB_OK | MB_ICONERROR);

    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);


    MSG msg = { 0 };

    while (GetMessage(&msg, NULL, 0, 0))
    {

        TranslateMessage(&msg);
        DispatchMessage(&msg);

    }

    return 0;

}

LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{

    switch (msg)
    {
    case WM_CREATE:
        addControl(hWnd);
        break;

    case WM_COMMAND:

        if (HIWORD(wp) == CBN_SELCHANGE)
        {
            if (LOWORD(wp) == COMBO1)
            {
                HWND hcombo = (HWND)lp;
                LRESULT index = SendMessageW(hcombo, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);

                wchar_t buf[256];

                SendMessageW(hcombo, (UINT)CB_GETLBTEXT, (WPARAM)index, (LPARAM)buf);
                MessageBoxW(hWnd, buf, L"Good Example", 0);
            }
            break;
        }
        switch (LOWORD(wp))
        {
        case OPTINBT1:
            MessageBoxW(hWnd, L"This is Radio button1: ", L"Radio Button 2 is good", MB_OK);
            break;
        case OPTINBT2:
            MessageBoxW(hWnd, L"This is Radio button2: ", L"Radio Button 1 is good", MB_OK);
            break;
        default:break;
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, msg, wp, lp);
    }

    return 0;
}

void addControl(HWND hWnd)
{
    HWND OptBt1, OptBt2;

    const LPCWSTR cont1 = L"STATIC";
    const LPCWSTR cont2 = L"COMBOBOX";
    const LPCWSTR cont3 = L"BUTTON";
    const LPCWSTR emptyS = L"";
    const LPCWSTR bl = L"RButton 1";
    const LPCWSTR b2 = L"RButton 2";
    //Option buttons
    OptBt1 = CreateWindowW(cont3, bl, WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, 24, 8, 90, 25, hWnd, (HMENU)OPTINBT1, NULL, NULL);
    OptBt2 = CreateWindowW(cont3, b2, WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON, 24, 40, 90, 25, hWnd, (HMENU)OPTINBT2, NULL, NULL);
    SendMessage(OptBt1, BM_SETCHECK, BST_CHECKED, 0);

    hComboOne = CreateWindowW(cont2, emptyS, WS_VISIBLE | WS_CHILD | CBS_DROPDOWN | CBS_HASSTRINGS | WS_VSCROLL, 77, 70, 150, 150, hWnd, (HMENU)COMBO1, 0, 0);

    LPCWSTR ComboBoxItems[] = { L"Subject1", L"Subject2", L"Subject3",
        L"Subject4", L"Subject5" };

    /** Or the array way */
    SendMessageW(hComboOne, CB_ADDSTRING, 0, (LPARAM)ComboBoxItems[0]);
    SendMessageW(hComboOne, CB_ADDSTRING, 0, (LPARAM)ComboBoxItems[1]);
    SendMessageW(hComboOne, CB_ADDSTRING, 0, (LPARAM)ComboBoxItems[2]);
    SendMessageW(hComboOne, CB_ADDSTRING, 0, (LPARAM)ComboBoxItems[3]);
    SendMessageW(hComboOne, CB_ADDSTRING, 0, (LPARAM)ComboBoxItems[4]);

}

應在addControl之前插入WM_CREATE

WM_COMMAND響應CBN_SELCHANGE通知以檢測組合框選擇的變化。

當您顯示消息框時,您可以使用自己的窗口MessageBox(hWnd,...)的句柄。 如果提供NULL作為句柄,則消息框將成為桌面窗口的子項,其行為就像在無模式模式下顯示一樣。

switch(msg)
{
case WM_CREATE:
    addControl(hWnd);
    break;

case WM_COMMAND:
    if(HIWORD(wp) == CBN_SELCHANGE)
    {
        if(LOWORD(wp) == COMBO1)
        {
            HWND hcombo = (HWND)lp;
            int index = SendMessage(hcombo, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
            char buf[256];
            SendMessage(hcombo, (UINT)CB_GETLBTEXT, (WPARAM)index, (LPARAM)buf);
            MessageBox(hWnd, buf, 0, 0);
        }
        break;
    }

    switch(LOWORD(wp))
    {
    case OPTINBT1:
        MessageBox(hWnd, "This is Radio button1: ", "ComboBox Working??", MB_OK);
        break;
    case OPTINBT2:
        MessageBox(hWnd, "This is Radio button2: ", "ComboBox Working??", MB_OK);
        break;
    default:break;
    }
    break;

與您的問題無關,但您正在將Unicode(示例L"EDIT" )與ANSI(示例"EDIT" )混合使用。

CreateWindow這樣的窗口函數是宏。 在ANSI中它是CreateWindowA ,在Unicode中它是寬函數CreateWindowW

您正在以舊的ANSI模式編譯您的程序。 CreateWindow是一個宏CreateWindowA這就需要ANSI輸入。 CreateWindow("EDIT",...)

如果用Unicode編譯程序, CreateWindow是寬函數CreateWindowW的宏,它使用Unicode參數CreateWindow(L"EDIT",...)

如果在Visual Studio中創建項目,則默認使用新的Unicode標准。 在任何地方都使用寬字符( L"Text" )和Unicode函數。 我建議用警告級別4編譯程序。確保程序編譯時沒有警告。

您想要響應發送到窗口過程的CBN_SELCHANGE消息。 WM_COMMAND的情況下,wParam的低位字將包含控制ID,高位字將包含可選的命令代碼。

該命令代碼對於正確響應組合框消息至關重要。 您將要通過向組合框發送CB_GETCURSEL然后CB_GETLBTEXTLENCB_GETLBTEXT來響應CBN_SELCHANGE消息,之后您可以向編輯控件發送帶有檢索文本的WM_SETTEXT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM