Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 23.02.2012
Сообщений: 5

Обработка нажатий мыши, перерисовка окна

30.12.2013, 22:25. Показов 5064. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем пытаюсь решить вот такое задание: В окне приложения отобразить кнопку "Клавиши отжаты". При нажатии любой клавиши мыши над рабочей областью окна эта кнопка исчезает и под курсором мыши появляется кнопка "Клавиша нажата". При отжатии клавиши мыши вернуться к исходному состоянию.

И вроде бы все правильно, но компилятор ругается на функцию GreatWindow, которая вызывается в функции WndProc: "hInstance: необъявленный идентификатор". Подскажите, что же не так?
Вот мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <windows.h>
//#include "stdafx.h"
 
HWND btn1;
 
// объявление функций
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM RegMyWindowClass(HINSTANCE, LPCTSTR);
 
////////////////////////////////////////////////////////////////////////// 
// функция вхождений программы WinMain
int APIENTRY WinMain(HINSTANCE hInstance,
             HINSTANCE         hPrevInstance,
             LPSTR             lpCmdLine,
             int               nCmdShow)
{
  // имя будущего класса
  LPCTSTR lpzClass = TEXT("My Window Class!");
 
  // регистрация класса
  if (!RegMyWindowClass(hInstance, lpzClass))
    return 1;
 
  // вычисление координат центра экрана
  RECT screen_rect;
  GetWindowRect(GetDesktopWindow(),&screen_rect); // разрешение экрана
  int x =200;
  int y =200;
 
  // создание диалогового окна
  HWND hWnd = CreateWindow(lpzClass, TEXT("Dialog Window"), 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE, x, y, 600, 500, NULL, NULL, 
    hInstance, NULL);
 
  // создание кнопки
  btn1 = CreateWindow(L"button",L"Клавиши отжаты", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        x, y, 150, 50, hWnd, (HMENU)10000, hInstance, NULL);
 
  // если окно не создано, описатель будет равен 0
  if(!hWnd) return 2; 
 
  // цикл сообщений приложения
  MSG msg = {0};    // структура сообщения
  int iGetOk = 0;   // переменная состояния
  while ((iGetOk = GetMessage(&msg, NULL, 0, 0 )) != 0) // цикл сообщений
  {
    if (iGetOk == -1) return 3;  // если GetMessage вернул ошибку - выход
    TranslateMessage(&msg);    
    DispatchMessage(&msg);
  }
 
  return msg.wParam;  // возвращаем код завершения программы
}
 
////////////////////////////////////////////////////////////////////////// 
// функция регистрации класса окон
ATOM RegMyWindowClass(HINSTANCE hInst, LPCTSTR lpzClassName)
{
  WNDCLASS wcWindowClass = {0};
  // адрес ф-ции обработки сообщений
  wcWindowClass.lpfnWndProc = (WNDPROC)WndProc;
  // стиль окна
  wcWindowClass.style = CS_HREDRAW|CS_VREDRAW;
  // дискриптор экземпляра приложения
  wcWindowClass.hInstance = hInst;
  // название класса
  wcWindowClass.lpszClassName = lpzClassName;
  // загрузка курсора
  wcWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  // загрузка цвета окон
  wcWindowClass.hbrBackground = (HBRUSH)COLOR_APPWORKSPACE;
  return RegisterClass(&wcWindowClass); // регистрация класса
}
 
////////////////////////////////////////////////////////////////////////// 
// функция обработки сообщений
LRESULT CALLBACK WndProc(
  HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int a,b; //координаты мыши
 
  // выборка и обработка сообщений
  switch (message)
  {
 
  case WM_LBUTTONDOWN:
 
      case WM_RBUTTONDOWN:
     // реакция на сообщение
    DestroyWindow(btn1);
    a=LOWORD(lParam); //узнаём координаты
    b=HIWORD(lParam);
    CreateWindow("button","Клавиши нажаты", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        a, b, 150, 50, hWnd, (HMENU)10000, hInstance, NULL);
 
    break;
 
  case WM_DESTROY:
    PostQuitMessage(0);  // реакция на сообщение
    break;
  default:  
    // все сообщения не обработанные Вами обработает сама Windows
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2013, 22:25
Ответы с готовыми решениями:

Перерисовка окна по клику мыши
Вопрос такой, как перерисовать окно по клику мыши? При чем нужно сделать так. чтобы при клике в опр область окно рисовалось определенным...

Обработка нажатий кнопок мыши на регион
При нажатии ПКМ на регион(квадрат) действий не происходит. В чём проблема? #include &lt;windows.h&gt; LRESULT CALLBACK WndProc...

Обработка нажатий мыши на label-ы
Всем привет. Только начал изучать C#. Написал простенькую программу. Но почему-то надписи(label) не работают. Задумка какая, при клике на...

2
Невнимательный
 Аватар для ft4l
3107 / 1281 / 358
Регистрация: 08.02.2013
Сообщений: 7,493
Записей в блоге: 2
31.12.2013, 01:43
область видимости...

CreateWindow
.....

hInstance
[in] Windows 95/98/Me: Handle to the instance of the module to be associated with the window.
Windows NT/2000/XP: This value is ignored.
можно заменить на NULL, если >= NT/2000/XP
или если нужно создать в глобальной области видимости
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
31.12.2013, 02:20
C++
1
2
3
case WM_LBUTTONDOWN:
 
      case WM_RBUTTONDOWN:
Разве можно подряд, без прерывания(break) ?

Добавлено через 10 минут
Адд:
Есть файл, называется "winuser.h", там есть список команд в SendMessage (для мыши):
(строка с низу в VStudio): Ln 1923
C++
1
2
3
4
5
6
7
8
9
10
11
#define WM_MOUSEFIRST                   0x0200
#define WM_MOUSEMOVE                    0x0200
#define WM_LBUTTONDOWN                  0x0201
#define WM_LBUTTONUP                    0x0202
#define WM_LBUTTONDBLCLK                0x0203
#define WM_RBUTTONDOWN                  0x0204
#define WM_RBUTTONUP                    0x0205
#define WM_RBUTTONDBLCLK                0x0206
#define WM_MBUTTONDOWN                  0x0207
#define WM_MBUTTONUP                    0x0208
#define WM_MBUTTONDBLCLK                0x0209
Вот их и надо использовать в
switch(Message)
,
в твоём случае зажатие:
BUTTONDOWN
и отжатие:
BUTTONUP
(если не наоборот )

Добавлено через 21 минуту
адд:
hInstance - это типа уникальный ключ программы, заметь он присутствует в "main" функции.
hInstance hInst;(например hInst - объявить как глобальную переменную, затем приравнять:
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)
{
WNDCLASS WndClass;
MSG Msg;
hInst = hInstance;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc=WndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICA TION);
WndClass.hCursor=LoadCursor(NULL,IDC_ARR OW);
WndClass.hbrBackground=(HBRUSH)GetStockO bject(COLOR_WINDOW+1);
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName="menu";
if(!RegisterClass(&WndClass))
{
MessageBox(NULL,"Невозможно зарегистрировать класс","Ошибка",MB_OK);
return 0;
}
А вообще, такое лучше читать... самый лучший:
"c++ wm_keydown"
=
http://msdn.microsoft.com/en-u... 85%29.aspx

переводчиком можно...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2013, 02:20
Помогаю со студенческими работами здесь

Обработка нажатий клавиш мыши и кнопок клавиатуры
Здравствуйте, возникла проблема с кодом: private void Form1_MouseDown(object sender, MouseEventArgs e) { ...

Обработка нажатий мыши, выделение некой области
Прошу совета. Задача заключается в следующем: На странице необходимо создать поле(таблицу) размером NxN ячеек указанного размера. Нужны два...

Перерисовка окна другого процесса через дескриптор этого окна
Приветствую всех. Может кто-то знает, как перерисовать окно другого процесса через дескриптор (IntPtr) этого окна. Может апишная функция...

В рабочей части окна при движении мыши с нажатой левой клавишей мыши рисовать траекторию движения курсора мыши
В рабочей части окна при движении мыши с нажатой левой клавишей мыши рисовать траекторию движения курсора мыши.При нажатии правой клавиши...

Запоминание нажатий кнопок и мыши
Как сделать чтобы все нажатия с клавиатуры и мыши посылались в Memo даже если форма на которой расположено Memo не активна? Например если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru