Tomsk Sysadmins Forum
Windows => Программирование => Topic started by: arido on December 12, 2006, 21:05:07
-
Проблема вот в чем.
Я создала окно ввода пароля.
...
case WM_CREATE:
{
cxClient = width;//floor(cxClient/4);
cyClient = height-GetSystemMetrics(SM_CYSIZE)-6;
widthB = floor(cxClient-6);
heightB = floor(cyClient/3);
//Ñîçäàíèå ìåòêè
WLabel = CreateWindow("Static", Label[0],
WS_CHILD|WS_VISIBLE|SS_CENTER,
0, 0, widthB, height-12,hWnd,
NULL, hInstance, NULL);
//Ñîçäàíèå ðåäàêòîðà
WEdit = CreateWindow("EDIT", NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|
ES_CENTER|ES_PASSWORD,
0, heightB-10, widthB, heightB, hWnd,
(HMENU)ID_EDIT, hInstance, NULL);
//Îãðàíè÷åíèå êîëè÷åñòâà ââîäèìûõ ñèìâîëîâ
SendMessage(WEdit, EM_LIMITTEXT,5,0);
//Ñîçäàíèå êíîïîê
WBtn1 = CreateWindow("Button", Buttons[3],
BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
10, heightB*2-5, widthB/3, heightB, hWnd,
(HMENU)ID_OK, hInstance, NULL);
WBtn2 = CreateWindow("Button", Buttons[4],
WS_CHILD|WS_VISIBLE|WS_TABSTOP,
widthB-10-widthB/3, heightB*2-5, widthB/3, heightB, hWnd,
(HMENU)ID_EXIT, hInstance, NULL);
//Ïåðåäà÷à ôîêóñà ðåäàêòîðó
SetFocus(WEdit);
return 0;
}
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_EXIT:
{
SendMessage(hWndFirst, WM_CLOSE, NULL, NULL);
return 0;
}
case ID_OK:
{
SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code);
MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK);
return 0;
}
....
Хочу, чтобы при нажатии Enter в однострочном редакторе выполнялась функция кнопки Принять, а при нажатии Esc - программа закрывалась.
Пробовала так
case ID_EDIT:
{
SendMessage(hWndFirst, WM_KEYDOWN, NULL, NULL);
return 0;
}
но он "не воспринимает" Esc и Enter.
Подскажите как решить проблему.
-
SendMessage(hWndFirst, WM_KEYDOWN, NULL, NULL);
Ты вызываешь обработчик нажатия кнопки окна hWndFirst c wParam и lParam == NULL. Надо указать код нажатой кнопки в wPAram, а то что-то обработчик не поймёт какую кнопку нажали, а в WM_COMMAND его взять негде. Вобщем, подход нерабочий. Время будет, пример придумаю.
Пример сделал, у меня работает, НО написан на assembler. Оптимизации нет, поэтому читаться будет проще. Откомментирован нормально.
Идея в субклассе Edit'а. И обработке событий нажатий на кнопки Enter и Esc.
-
...
Идея в субклассе Edit'а. И обработке событий нажатий на кнопки Enter и Esc.
Спасибо.
Кнопки Enter и Esc в Edit заработали, но тепереь вместо пароля, который я ввожу, получаю пустую строку.
Куда проподают символы напонятно.
SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code);
MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK);
-
Во-первых, SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code) должна поместить строку символов по адресу, на который указывает Code. Так ли это смотрим в отладчике. И вернуть должна число скопированных символов.
Во-вторых, MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK) выведет строку, но заканчивающуюся (ни хрена себе окончание!) нулём!!! А SendMessage вернёт строку без нуля в конце. Поэтому надо нолик вписать.
В-третьих, мой пример у меня работает и выдаёт строку в "мессаге". Код там такой:
mov word ptr Buff, 32
invoke SendMessage, hEdit, EM_GETLINE, NULL, offset Buff
add eax, offset Buff
mov byte ptr [eax], 0
invoke MessageBox, hwnd, offset Buff, offset szMsgCaption, MB_OK
ret
перевод:
// Извини, точно синтаксис Си не помню, вобщем первое слово = размер буфера:
// ***** скорее всего здесь у тебя косяк, т.к. там у тебя наверное ноль...*****
(WORD&)Buff[0] = 32;
int pos = SendMessage(hEdit, EM_GETLINE, NULL, Buff);
Buff[pos] = 0;
MessageBox(hwnd, Buff, szMsgCaption, MB_OK);
-
А тебе принципиально надо именно API-функциями окно создавать?
Почему не нарисовать шаблон диалога в редакторе ресурсов и не отобразить его, всё будет проще.
-
Во-первых, SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code) должна поместить строку символов по адресу, на который указывает Code. Так ли это смотрим в отладчике. И вернуть должна число скопированных символов.
Во-вторых, MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK) выведет строку, но заканчивающуюся (ни хрена себе окончание!) нулём!!! А SendMessage вернёт строку без нуля в конце. Поэтому надо нолик вписать.
В-третьих, мой пример у меня работает и выдаёт строку в "мессаге". Код там такой:
mov word ptr Buff, 32
invoke SendMessage, hEdit, EM_GETLINE, NULL, offset Buff
add eax, offset Buff
mov byte ptr [eax], 0
invoke MessageBox, hwnd, offset Buff, offset szMsgCaption, MB_OK
ret
перевод:
// Извини, точно синтаксис Си не помню, вобщем первое слово = размер буфера:
// ***** скорее всего здесь у тебя косяк, т.к. там у тебя наверное ноль...*****
(WORD&)Buff[0] = 32;
int pos = SendMessage(hEdit, EM_GETLINE, NULL, Buff);
Buff[pos] = 0;
MessageBox(hwnd, Buff, szMsgCaption, MB_OK);
Ура!!!
Наконец я его настроила!
Всем спасибо!
Будем работать дальше.
Тема закрыта.