Author Topic: Создание Edit с помощью API-функций  (Read 4872 times)

0 Members and 1 Guest are viewing this topic.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Создание Edit с помощью API-функций
« on: December 12, 2006, 21:05:07 »
Проблема вот в чем.
Я создала окно ввода пароля.
Code: [Select]
...
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 - программа закрывалась.
Пробовала так
Code: [Select]
              case ID_EDIT:
                        {
                         SendMessage(hWndFirst, WM_KEYDOWN, NULL, NULL);
                         return 0;
                        }
но он "не воспринимает" Esc и Enter.
Подскажите как решить проблему.
« Last Edit: December 12, 2006, 21:06:16 by arido »

Offline twobrothers

  • Full Member
  • ***
  • Posts: 118
  • Karma: +0/-0
Создание Edit с помощью API-функций
« Reply #1 on: December 13, 2006, 08:48:23 »
SendMessage(hWndFirst, WM_KEYDOWN, NULL, NULL);

Ты вызываешь обработчик нажатия кнопки окна hWndFirst c wParam и lParam == NULL. Надо указать код нажатой кнопки в wPAram, а то что-то обработчик не поймёт какую кнопку нажали, а в WM_COMMAND его взять негде. Вобщем, подход нерабочий. Время будет, пример придумаю.

Пример сделал, у меня работает, НО написан на assembler. Оптимизации нет, поэтому читаться будет проще. Откомментирован нормально.  
Идея в субклассе Edit'а. И обработке событий нажатий на кнопки Enter и Esc.
« Last Edit: December 13, 2006, 11:42:04 by twobrothers »
Вредоносней пользователя вируса нет!

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Создание Edit с помощью API-функций
« Reply #2 on: December 20, 2006, 20:58:12 »
Quote from: twobrothers
...
Идея в субклассе Edit'а. И обработке событий нажатий на кнопки Enter и Esc.
Спасибо.
Кнопки Enter и Esc в Edit заработали, но тепереь вместо пароля, который я ввожу, получаю пустую строку.
Куда проподают символы напонятно.  
Code: [Select]
SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code);
MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK);

Offline twobrothers

  • Full Member
  • ***
  • Posts: 118
  • Karma: +0/-0
Создание Edit с помощью API-функций
« Reply #3 on: December 21, 2006, 15:15:41 »
Во-первых, SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code) должна поместить строку символов по адресу, на который указывает Code. Так ли это смотрим в отладчике. И вернуть должна число скопированных символов.

Во-вторых, MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK) выведет строку, но заканчивающуюся (ни хрена себе окончание!) нулём!!! А SendMessage вернёт строку без нуля в конце. Поэтому надо нолик вписать.

В-третьих, мой пример у меня работает и выдаёт строку в "мессаге". Код там такой:

Code: [Select]
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

перевод:

Code: [Select]
// Извини, точно синтаксис Си не помню, вобщем первое слово = размер буфера:
// ***** скорее всего здесь у тебя косяк, т.к. там у тебя наверное ноль...*****
(WORD&)Buff[0] = 32;
int pos = SendMessage(hEdit, EM_GETLINE, NULL, Buff);
Buff[pos] = 0;
MessageBox(hwnd, Buff, szMsgCaption, MB_OK);
« Last Edit: December 21, 2006, 15:37:28 by twobrothers »
Вредоносней пользователя вируса нет!

Offline Кирдык

  • Newbie
  • *
  • Posts: 5
  • Karma: +0/-0
Создание Edit с помощью API-функций
« Reply #4 on: January 16, 2007, 15:23:15 »
А тебе принципиально надо именно API-функциями окно создавать?

Почему не нарисовать шаблон диалога в редакторе ресурсов и не отобразить его, всё будет проще.

Offline arido

  • Newbie
  • *
  • Posts: 33
  • Karma: +0/-0
Создание Edit с помощью API-функций
« Reply #5 on: February 26, 2007, 20:56:05 »
Quote from: twobrothers
Во-первых, SendMessage(WEdit, EM_GETLINE, 0, (LPARAM)Code) должна поместить строку символов по адресу, на который указывает Code. Так ли это смотрим в отладчике. И вернуть должна число скопированных символов.

Во-вторых, MessageBox(hWnd, Code, "ВНИМАНИЕ", MB_OK) выведет строку, но заканчивающуюся (ни хрена себе окончание!) нулём!!! А SendMessage вернёт строку без нуля в конце. Поэтому надо нолик вписать.

В-третьих, мой пример у меня работает и выдаёт строку в "мессаге". Код там такой:

Code: [Select]
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

перевод:

Code: [Select]
// Извини, точно синтаксис Си не помню, вобщем первое слово = размер буфера:
// ***** скорее всего здесь у тебя косяк, т.к. там у тебя наверное ноль...*****
(WORD&)Buff[0] = 32;
int pos = SendMessage(hEdit, EM_GETLINE, NULL, Buff);
Buff[pos] = 0;
MessageBox(hwnd, Buff, szMsgCaption, MB_OK);

Ура!!!
Наконец я его настроила!
Всем спасибо!
Будем работать дальше.

Тема закрыта.