Код | #include <windows.h> #include <windowsx.h>
#define IDC_BUTTON1 101 #define IDC_EDIT1 102
static char lpszAppName[] = "Proga";
WNDPROC OldEditWndProc; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HWND hwndMain; WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDC_ARROW); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wc.lpszMenuName = NULL; wc.lpszClassName = lpszAppName; wc.cbSize = sizeof( WNDCLASSEX ); wc.hIconSm = NULL; if ( RegisterClassEx( &wc ) == 0 ) return( FALSE ); hwndMain = CreateWindow( lpszAppName, lpszAppName, WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX , CW_USEDEFAULT, 0, 520, 335, NULL, NULL, hInstance, NULL); if (!hwndMain) return( FALSE ); ShowWindow( hwndMain, nCmdShow ); UpdateWindow(hwndMain); while (GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
LRESULT CALLBACK NewButtonProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { case WM_KEYDOWN: if (wParam == VK_RETURN) { HWND Button = GetDlgItem(GetParent(hwnd), IDC_BUTTON1); SendMessage(Button, WM_KEYDOWN, VK_SPACE, 0); SendMessage(Button, WM_KEYUP, VK_SPACE, 0); } break; } return CallWindowProc(OldEditWndProc, hwnd, Msg, wParam, lParam); }
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_DESTROY: { SubclassWindow(GetDlgItem(hWnd, IDC_EDIT1), OldEditWndProc); // это макрос из windowsx.h PostQuitMessage(0); } return 0; case WM_CREATE: { HWND Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT" , "", WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_NUMBER |WS_BORDER, 120, 30, 90, 20, hWnd, (HMENU)IDC_EDIT1, ((CREATESTRUCT*)lParam)->hInstance, NULL ); OldEditWndProc = SubclassWindow(Edit, NewButtonProc);
CreateWindow( "BUTTON", "Выполнить", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 10, 220, 100, 20, hWnd, (HMENU)IDC_BUTTON1, ((CREATESTRUCT*)lParam)->hInstance, NULL ); SetFocus(Edit); } return TRUE; case WM_COMMAND: { if (LOWORD(wParam) == IDC_BUTTON1) { HWND Edit = GetDlgItem(hWnd, IDC_EDIT1); char buf[512]; buf[GetWindowText(Edit, buf, 512)] = 0; MessageBox(hWnd, buf, "A", MB_OK); SetFocus(Edit); } } return TRUE; } return CallWindowProc(DefWindowProc, hWnd,uMsg, wParam, lParam); }
|
Отладка того, что ты дал, оказалось не таким уж и легким. Мне конечно неважно, но лучше возьми хорошую книжку, где рассказано, как писать на WinAPI.
ЗЫ: ничего не поясняю преднамеренно. разборка такого кода тебе поможет. Решение не самое оптимальное, но для обучения достаточно. |