Создание диалогового окна с текстовым вводом и другими пользовательскими взаимодействиями с просто Win32 API?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Создание диалогового окна с текстовым вводом и другими пользовательскими взаимодействиями с просто Win32 API?

Сообщение Anonymous »

Я делаю (модальное) диалоговое окно с вводом текста в C или C ++ только с API win32 (без MFC или тому подобное): < /p>

Я сделал это с нуля (см. Код ниже) и Это работает, но каждый раз, когда я добавляю новую основную функциональность и использую ее, я обнаруживаю, что еще одна недостающая функция, которая, тем не менее, распространена в таких диалоговых окнах с текстовыми входами (присутствует во многих программных программных делах!):

[*] Я должен вручную кодировать enter < /kbd> => отправить "ok". < /li>
Тогда я осознавать клавиши стрел Не работайте. > Затем я вижу home и end тоже не работайте.
[*] То же самое для ctrl+c , ctrl+v , ctrl+x , ctrl+a .
[*] То же самое для контекстного меню < /li>
....
Тогда я понимаю del тоже не поддерживается. KBD> Tab следует включить фокус из входного виджета, кнопка OK, кнопка отмены. бренд /> Вопрос: как с Pure Win32 API и C/C ++, чтобы создать диалоговое окно с текстовым вводом, без переосмысления колеса+бесконечный список небольших взаимодействий пользовательского интерфейса, к которым мы привыкли?
Есть ли встроенный способ в API Win32?
пример, Скомпилируется с cl main.cpp/link user32.lib или аналогично, достигая этого, не требуя файла .rc и без необходимости IDE?
LRESULT CALLBACK EditWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CREATE:
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT, 10, 10, 580, 25, hWnd, (HMENU)ID_EDIT, NULL, NULL);
SetFocus(hEdit);
originalEditProc = (WNDPROC)GetWindowLongPtr(hEdit, GWLP_WNDPROC);
SetWindowLongPtr(hEdit, GWLP_WNDPROC, (LONG_PTR)EditWndProc);
CreateWindow("BUTTON", "OK", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 10, 50, 80, 30, hWnd, (HMENU)ID_OK, NULL, NULL);
CreateWindow("BUTTON", "Cancel", WS_CHILD | WS_VISIBLE, 100, 50, 80, 30, hWnd, (HMENU)ID_CANCEL, NULL, NULL);
break;
case WM_COMMAND: {
int wmId = LOWORD(wParam);
if (wmId == ID_OK) {
GetWindowText(hEdit, g_input, sizeof(g_input));
DestroyWindow(hWnd);
} else if (wmId == ID_CANCEL) {
g_input[0] = '\0';
DestroyWindow(hWnd);
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

LRESULT CALLBACK EditWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_KEYDOWN:
if (wParam == VK_RETURN) {
GetWindowText(hWnd, g_input, sizeof(g_input));
HWND parentWnd = GetParent(hWnd);
PostMessage(parentWnd, WM_COMMAND, ID_OK, 0);
return 0; // Prevent default processing (no newline in edit control)
}
break;
default:
if (originalEditProc) {
return CallWindowProc(originalEditProc, hWnd, message, wParam, lParam);
}
break;
}
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... -just-win3
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»