Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Закрытие окна по нажатию ENTER (win api) 
:(
    Опции темы
Robix
Дата 12.3.2011, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Это окно, пример из книги Ivor Horton’s Beginning Visual C++ 2010, которую я читаю
Окно под win32 с использованием только API


Код

// Ex12_01.cpp   Native windows program to display text in a window
#include <windows.h>

LRESULT WINAPI WindowProc(HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam);

   // Insert code for WinMain() here (Listing OFWIN_1)
// Listing OFWIN_1
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{

  WNDCLASSEX WindowClass;     // Structure to hold our window's attributes

  static LPCTSTR szAppName = L"OFWin";       // Define window class name
  HWND hWnd;                                // Window handle
  MSG msg;                                  // Windows message structure

  WindowClass.cbSize = sizeof(WNDCLASSEX);  // Set structure size

  // Redraw the window if the size changes
  WindowClass.style   = CS_HREDRAW | CS_VREDRAW;

  // Define the message handling function
  WindowClass.lpfnWndProc = WindowProc;

  WindowClass.cbClsExtra = 0;     // No extra bytes after the window class
  WindowClass.cbWndExtra = 0;     // structure or the window instance

  WindowClass.hInstance = hInstance;        // Application instance handle

  // Set default application icon
  WindowClass.hIcon = LoadIcon(0, IDI_APPLICATION);

  // Set window cursor to be the standard arrow
  WindowClass.hCursor = LoadCursor(0, IDC_ARROW);

  // Set gray brush for background color
  WindowClass.hbrBackground = 
                          static_cast<HBRUSH>(GetStockObject(GRAY_BRUSH));

  WindowClass.lpszMenuName = 0;             // No menu
  WindowClass.lpszClassName = szAppName;    // Set class name
  WindowClass.hIconSm = 0;                  // Default small icon

  // Now register our window class
  RegisterClassEx(&WindowClass);

  // Now we can create the window
  hWnd = CreateWindow(
          szAppName,                       // the window class name
          L"A Basic Window the Hard Way",   // The window title
          WS_OVERLAPPEDWINDOW,             // Window style as overlapped
          CW_USEDEFAULT,          // Default screen position of  upper left
          CW_USEDEFAULT,          // corner of our window as x,y...
          CW_USEDEFAULT,          // Default window size
          CW_USEDEFAULT,          // .... 
          0,                      // No parent window
          0,                      // No menu
          hInstance,              // Program Instance handle
          0                       // No window creation data
        );

  ShowWindow(hWnd, nCmdShow);     // Display the window
  UpdateWindow(hWnd);             // Cause window client area to be drawn

  // The message loop
  while(GetMessage(&msg, 0, 0, 0) == TRUE)  // Get any messages
  {
    TranslateMessage(&msg);                 // Translate the message
    DispatchMessage(&msg);                  // Dispatch the message
  }

  return static_cast<int>(msg.wParam);      // End, so return to Windows
}

   // Insert code for WindowProc() here (Listing OFWIN_2)
// Listing OFWIN_2
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, 
                          WPARAM wParam, LPARAM lParam)
{
  HDC hDC;                       // Display context handle
  PAINTSTRUCT PaintSt;           // Structure defining area to be drawn
  RECT aRect;                    // A working rectangle

  switch(message)                // Process selected messages
  {
    case WM_PAINT:                     // Message is to redraw the window
      hDC = BeginPaint(hWnd, &PaintSt);// Prepare to draw the window

      // Get upper left and lower right of client area
      GetClientRect(hWnd, &aRect);

      SetBkMode(hDC, TRANSPARENT);     // Set text background mode

      // Now draw the text in the window client area
      DrawText(
             hDC,                 // Device context handle
             L"Простое окно, созданное трудным путем",
             -1,                  // Indicate null terminated string
             &aRect,              // Rectangle in which text is to be drawn
             DT_SINGLELINE|       // Text format - single line
             DT_CENTER|           //             - centered in the line
             DT_VCENTER);         //             - line centered in aRect

      EndPaint(hWnd, &PaintSt);   // Terminate window redraw operation
      return 0;

    case WM_DESTROY:              // Window is being destroyed
      PostQuitMessage(0);
      return 0;

    default:                      // Any other message - we don't
                                  // want to know, so call
                                  // default message processing
      return DefWindowProc(hWnd, message, wParam, lParam);
  }
}




Я впринципе не собираюсь программировать много, используя WIN API,
но мне интересно, как добавить в это окно код, который надлежащим образом закроет его, при нажатии на клавишу ENTER. Я думаю этот код надо разместить в одном из case функции 
switch(message) [строчка 86]. 
У кого есть опыт, напишите пожалуйста, как должен выглядеть этот код ?
PM MAIL   Вверх
миг
Дата 12.3.2011, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: 1
Всего: 1



в эту функцию нужно добавить сообщение от клавиатуры
Цитата(Robix @  12.3.2011,  20:09 Найти цитируемый пост)
LRESULT WINAPI WindowProc(HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam);

Код

switch(message)                // Process selected messages
  {
    case WM_KEYDOWN:
        if(wParam==13)DestroyWindow(hWnd);
        break;


Это сообщение отредактировал(а) миг - 12.3.2011, 21:06
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Robix
Дата 13.3.2011, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Спасибо. Эта функция DestroyWindow и есть обычный выход из программы, т.е. равносильно закрытию окна кнопкой в правом верхнем углу ?
PM MAIL   Вверх
миг
Дата 13.3.2011, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: 1
Всего: 1



Цитата(Robix @  13.3.2011,  02:26 Найти цитируемый пост)
Эта функция DestroyWindow и есть обычный выход из программы, т.е. равносильно закрытию окна кнопкой в правом верхнем углу ?

да. в ней задается параметр окна, который нужно уничтожить. Уничтожаются все связанные дочерние окна окна, немодальные диалоговые окна.  функция DestroyWindow посылает сообщение  WM_DESTROY и WM_NCDESTROY . В WM_DESTROY вызывается функция PostQuitMessage(0).
Далее этот цикл
 
Код

  while(GetMessage(&msg, 0, 0, 0) == TRUE)  // Get any messages
  {
    TranslateMessage(&msg);                 // Translate the message
    DispatchMessage(&msg);                  // Dispatch the message
  }

Завершает свою работу и программа закрывается.
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Robix
Дата 15.3.2011, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



Спасибо.
У меня еще вопросик. Интересно, как сделать так, чтобы по нажатию Enter, в окне выводился вместо прежнего текст "Была нажата клавиша Enter".
Пробовал вставить функцию DrawText, в  case WM_KEYDOWN:
но все-таки не происходит рисования. Чего тут не хватает не подскажете ?

PM MAIL   Вверх
миг
Дата 15.3.2011, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: 1
Всего: 1



самый простой способ. создай глобальную переменную. Сохрани в ней свою строчку... Добавь функцию перерисовки экрана InvalidateRect. потом в WM_PAINTE перерисовывай.

Это сообщение отредактировал(а) миг - 15.3.2011, 05:51
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Robix
Дата 15.3.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



спасибо, работает.
Теперь понял, что  ф-ция InvalidateRect посылает сообщение для моего окна WM_PAINT, как и написано в документации.




PM MAIL   Вверх
Earnest
Дата 16.3.2011, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Не может быть, чтобы такое было в документации написано  smile 
InvalidateRect ничего не посылает, а просто помещает регион как инвалидный; а при ближайшей возможности система сама это дело проверяет и посылает тебе PAINT.



--------------------
...
PM   Вверх
Robix
Дата 16.3.2011, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



А почему система paint-событие  посылает только после этой ф-ции ? Без этой пометки как инвалидный не посылает что-ли ?  smile 

А еще вы не в курсе, как вывести не одну строку через  draw text, а две с переходом строки ?
Это нужно создавать специально два rectangle по пикселям окна и в них выводить строки ?
  


PM MAIL   Вверх
Earnest
Дата 17.3.2011, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(Robix @  16.3.2011,  22:15 Найти цитируемый пост)
А почему система paint-событие  посылает только после этой ф-ции ? Без этой пометки как инвалидный не посылает что-ли ?

Именно

Цитата(Robix @  16.3.2011,  22:15 Найти цитируемый пост)
 как вывести не одну строку через  draw text, а две с переходом строки ?

Нужно в строке поставить перевод строки (возможно, с переводом каретки, точно не помню). А прямоугольник сделать повыше, чтобы влезло. Возможно еще, что с флагами нужно подшаманить. -> MSDN


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.