Win32组合框,打印所选要编辑文本框的名称
Win32 Combobox, print the name of selected to edit text box
我正在为 win32 测试组合框。已经尝试了很多事情,但我不明白如何让它做我想让它做的事情。在组合框中进行选择时,我希望它打印到编辑框中。我相信这也许可以通过手柄来完成。
因此,如果我通过按钮 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]);
}
>WM_CREATE
应该插入addControl
之前。
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
是需要 ANSI 输入的宏CreateWindowA
。CreateWindow("EDIT",...)
如果用 Unicode 编译程序,则CreateWindow
是使用 Unicode 参数CreateWindow(L"EDIT",...)
的宽函数CreateWindowW
的宏
如果在Visual Studio中创建项目,它将默认为新的Unicode标准。在任何地方使用宽字符(L"Text"
)和Unicode函数。我建议使用警告级别 4 编译程序。确保程序在编译时没有警告。
您希望响应发送到窗口过程的CBN_SELCHANGE
消息。在 wParam 的低字WM_COMMAND
的情况下,低字将包含控件 ID,高字将包含可选的命令代码。
该命令代码对于正确响应组合框消息至关重要。您需要通过向组合框发送一个CB_GETCURSEL
然后CB_GETLBTEXTLEN
和CB_GETLBTEXT
来响应CBN_SELCHANGE
消息,之后您可以向编辑控件发送包含检索到的文本的WM_SETTEXT
。
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- 如何使用 c++ 实现并发文件/文本编辑?
- 如何在文本编辑器中处理 [-Wc++11-extensions]
- QT 创建器只会将第一个单词从文本编辑转换为纯文本
- 在C++的“编辑”文本框中禁用文本编辑,同时保持启用滚动
- 如何在Windows中将使用Qt制作的记事本设置为默认文本编辑器
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- UTF-16LE 编码问题与 Qt 文本编辑器用 C++ 编写
- 要求文本编辑,文本格式
- 如何将库导入文本编辑器
- 富文本编辑器--创建和维护项目符号列表时的问题
- 使用Strncpy在C++中创建一个简单的文本编辑器
- Qt C++ 如何在文本编辑的开头获取光标
- 在C 中创建简单的文本编辑器
- 在QT中遇到了丰富的文本编辑问题
- 递归功能以创建文本编辑
- 简单的C++文本编辑程序
- std::ifstream 在将文本编辑器从记事本++切换到Sublime Text 2以使用它正在读取的文件后无法读入?
- 使用 C++ 获取默认的 Windows 文本编辑器.exe路径
- 使用文本编辑器打开一个 txt 文件,而它已经被 "fopen()" 打开并正在使用中?