我在網上找到的這個示例代碼有一個串列下拉選單,當我單擊顯示專案的文本框時,它不允許我在框中鍵入任何內容。這是我自己的代碼想要的行為。但是,當我將這段代碼的相關部分粘貼到我自己的代碼中時,我的程式允許我在下拉框中鍵入字符。我在這段代碼中找不到導致用戶輸入被禁用的單個標志,但它只在這里正常作業,而不是出于某種原因在我的代碼中。
我什至嘗試注釋掉某些代碼行,看看它們是否負責禁用用戶輸入,但它仍然被禁用。然而在我的代碼中,無論我做什么,我都可以在串列框中鍵入其他字符,就好像它是任何其他文本欄位一樣。我不知道我錯過了什么。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hinst;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR lpCmdLine, int nCmdShow) {
HWND hwnd;
MSG msg ;
WNDCLASS wc = {0};
wc.lpszClassName = "Application";
wc.hInstance = hInstance ;
wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
wc.lpfnWndProc = WndProc ;
wc.hCursor = LoadCursor(0,IDC_ARROW);
g_hinst = hInstance;
RegisterClass(&wc);
hwnd = CreateWindow(wc.lpszClassName, "Combo box",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 270, 170, 0, 0, hInstance, 0);
while (GetMessage(&msg, NULL, 0, 0)) {
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam) {
static HWND hwndCombo;
//static HWND hwndStatic;
const char *items[] = { "FreeBSD", "OpenBSD",
"NetBSD", "Solaris", "Arch" };
switch(msg) {
case WM_CREATE:
hwndCombo = CreateWindow("Combobox", NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
10, 10, 120, 200, hwnd, NULL, g_hinst, NULL);
// CreateWindowW(L"Button", L"Drop down",
// WS_CHILD | WS_VISIBLE,
// 150, 10, 90, 25, hwnd, (HMENU) 1, g_hinst, NULL);
// hwndStatic = CreateWindowW(L"Static", L"",
// WS_CHILD | WS_VISIBLE,
// 150, 80, 90, 25, hwnd, NULL, g_hinst, NULL);
for (int i = 0; i < 4; i ) {
SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM) items[i]);
}
break;
case WM_COMMAND:
// if (HIWORD(wParam) == BN_CLICKED) {
// SendMessage(hwndCombo, CB_SHOWDROPDOWN, (WPARAM) TRUE, 0);
// }
if (HIWORD(wParam) == CBN_SELCHANGE) {
LRESULT sel = SendMessage(hwndCombo, CB_GETCURSEL, 0, 0);
// SetWindowTextW(hwndStatic, items[sel]);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProcW(hwnd, msg, wParam, lParam);
}
沒有特殊處理,沒有字符限制標志,沒有額外的源代碼或標頭,或資源檔案,什么都沒有......
我一遍又一遍地閱讀這段代碼,但我只是不明白是什么導致該程式將下拉項顯示為只讀文本。
我的代碼幾乎完全相同,只是一些額外的 switch 陳述句和函式,但組合框的功能應該是相同的。程式中是否有其他一些全域標志可能會導致用戶在不被允許的地方輸入?
uj5u.com熱心網友回復:
使用CBS_DROPDOWNLISTComboBox 上的樣式洗掉可寫編輯控制元件
hwndCombo = CreateWindow("Combobox", NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
10, 10, 120, 200, hwnd, NULL, g_hinst, NULL);
根據檔案:
組合框樣式
要使用 CreateWindow 或 CreateWindowEx 函式創建組合框,請指定 COMBOBOX 類、適當的視窗樣式常量以及以下組合框樣式的組合。
持續的 描述 ... ... CBS_DROPDOWN 與 CBS_SIMPLE 類似,除了串列框不會顯示,除非用戶選擇編輯控制元件旁邊的圖示。 CBS_DROPDOWNLIST 與 CBS_DROPDOWN 類似,不同之處在于編輯控制元件被替換為顯示串列框中當前選擇的靜態文本項。 ... ... CBS_SIMPLE 始終顯示串列框。串列框中的當前選擇顯示在編輯控制元件中。 ... ...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536253.html
標籤:C视窗winapi
