rttgedt Как приписать ей действие, чтобы на это действие НЕ откликалось текстовое поле. А то действие приписал, а на нее edit control откликается ((
Код (Text): #include <windows.h> HINSTANCE hInst; HWND hwnd; DWORD dwBytesWritten; int EditCtrlID = 12; HWND button; #define ID_BUTTON1 1000 LRESULT CALLBACK WndProc(HWND hwnd,UINT msg, WPARAM wParam,LPARAM lParam) { switch (msg) { case WM_DESTROY: // От ОС поступило сообщение о выходе PostQuitMessage(0); break; case INVALID_HANDLE_VALUE: MessageBeep(0); break; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BUTTON1: MessageBeep(1); char st[1000] = {"\0"}; GetDlgItemTextA( hwnd, EditCtrlID, // идентификатор элемента управления st, // адрес буфера для текста ARRAYSIZE(st) // максимальная длина строки ); char f[] = {"Name.txt\0"}; HANDLE hFile = CreateFileA( f, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL); } switch (msg) { default: return DefWindowProc(hwnd,msg,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = (WNDPROC)WndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(0); wc.lpszClassName = L"WndClass"; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION); if (!RegisterClass(&wc)) return 0; MSG msg; hInst = hInstance; hwnd = CreateWindow(L"WndClass",L"Click", WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT,502,502,0, 0, 0, hInst, NULL); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); hwnd = CreateWindow( L"edit", L"\n\n\nВаши заметки: ", WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT, 0, 0, 300, 500, hwnd, (HMENU) EditCtrlID, hInstance, NULL); HWND hwndCommandLink = CreateWindow( L"BUTTON", // Class; Unicode assumed. L"Кнопка", // Text will be defined later. WS_TABSTOP | WS_VISIBLE | WS_CHILD, // Styles. 10, // x position. 10, // y position. 100, // Button width. 28, // Button height. hwnd, // Parent window. (HMENU)ID_BUTTON1, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); // Pointer not needed. while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Mark, вот здесь всё довольно доходчиво расписано. В простейшем случае, можно внутри WM_COMMAND организовать switch case по LParam (т.е. хендлу окна, которое этот WM_COMMAND нам запостило).
DEEP Вот код. Студия ругается. Код (Text): #include <windows.h> HINSTANCE hInst; HWND hWnd; DWORD dwBytesWritten; const int EditCtrlID = 12; HWND button; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { <---------- Функция не может быть перегружена. MSG msg; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hbrBackground = (HBRUSH)(0); wc.lpszClassName = L"WndClass"; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION); if(!RegisterClass(&wc)) return 0; if(!hWnd)return 0; hWnd = CreateWindow(L"WndClass",L"Click", WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN| WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, CW_USEDEFAULT, CW_USEDEFAULT,502,502,0, 0, 0, hInstance, NULL); hWnd = CreateWindow(L"edit", L"\n\n\nÂàøè çàìåòêè: ", WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT, 0, 0, 300, 500, hWnd, NULL, hInstance, NULL); HWND hWnd_button = CreateWindow( L"button", L"Press me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 80, 30, hWnd, (HMENU)10000, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL,0 ,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: break; case WM_COMMAND: if(LOWORD(wParam)==10000) { MessageBeep(1); char st[1000] = {"\0"}; GetDlgItemTextA( hWnd, EditCtrlID, st, ARRAYSIZE(st) ); char f[] = {"Name.txt\0"}; HANDLE hFile = CreateFileA( f, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL); } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ..... int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { <---------- Функция не может быть перегружена. ......
Тьфу, бред. Не то. вот: (Проблема та же. Функция не может быть перегружена. Ругается VS Код (Text): #include <windows.h> DWORD dwBytesWritten; const int EditCtrlID = 12; MSG msg; HWND button; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; case WM_PAINT: break; case WM_COMMAND: if(LOWORD(wParam)==10000) { MessageBeep(1); char st[1000] = {""}; GetDlgItemTextA( hWnd, EditCtrlID, st, ARRAYSIZE(st) ); char f[] = {"Name.txt\0"}; HANDLE hFile = CreateFileA( f, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL); } default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, INT nCmdShow) { < ----------------------Вот тут. Функция не может быть перегружена wchar_t cname[] = L"Class"; wchar_t title[] = L"Заметки. Ver 1.0 Beta"; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = 0; wc.lpszClassName = cname; if(!RegisterClass(&wc)) return 0; HWND hWnd = CreateWindow( cname, title, WS_MINIMIZEBOX|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, 0, 0, 500, 300, NULL, NULL, hInstance, NULL ); if(!hWnd)return 0; HWND hWnd_button = CreateWindow( L"button", L"Press me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 80, 30, hWnd, (HMENU)10000, hInstance, NULL ); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); hWnd = CreateWindow(L"edit", L"\n\n\nВаши заметки: ", WS_VISIBLE | WS_CHILD | WS_HSCROLL |WS_VSCROLL|ES_NOHIDESEL|ES_MULTILINE|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE|ES_LEFT, 0, 0, 300, 500, hWnd, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL,0 ,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
LPSTR lpCmdLine -- вместо -- LPTSTR lpCmdLine. А также, пустой WM_PAINT делать нельзя. Код (Text): case WM_PAINT: return DefWindowProc (...);
Еще. Вот процедура взятия текста из edit control и сохранение в строке. Потом создается файл, и пишется в него строка. Результат: Файл создается. Текст берется и пишется. Когда открываю - в файле бред (( Код (Text): char st[10]; GetDlgItemTextA( hwnd, EditCtrlID, st, ARRAYSIZE(st) ); char f[] = {"Name.txt"}; HANDLE hFile = CreateFileA( f, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL);
Пробовал char, wchar_t ничего не изменяется. Брал текст из кнопки - берет. Из текстового поля нет - одни крокозябры ((
Марк, ты ведь используешь Студию? Поставь точку останова на это место: Код (Text): WriteFile(hFile, st, ARRAYSIZE(st), &dwBytesWritten, NULL); и посмотри что в строке 'st'. Возможно, что GetDlgItemTextA() не работает. Две причины для этого: 1. hwnd не тот что имеет текстовое поле. 2. ID текстового поля не такой какой ты создал.
Вот процедура создания файла, взятия текста и сохранения в файле: Код (Text): char message[100] = {" Туц "}; GetDlgItemTextA( hWnd, EditCtrlID, message, ARRAYSIZE(message) ); char f[] = {"Name.txt"}; HANDLE hFile = CreateFileA( f, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL ); WriteFile(hFile, message, ARRAYSIZE(message), &dwBytesWritten, NULL); Вот текстовое поле: