Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
popelyuk
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
#1

Почему ничего не рисуется при получении? - C++ WinAPI

29.01.2013, 02:24. Просмотров 382. Ответов 1
Метки нет (Все метки)

Там где получаю сообщение WM_SETCURSOR или пробовал WM_MOUSEMOVE координаты мышки пишет только когда запускаешь программу и при этом курсор находится в области окна, а когда двигаешь мышкой внутри ничего не перерисовывается, но сообщения приходят думал что может это много копий HelloWorldProc() запускается и они друг другу мешают добавил EnterCriticalSection/LeaveCriticalSection но всё-равно ничего не работает. Что я делаю не так? Но сообщения приходят т. к. message_counter показывает больше 1000 за секунду если постоянно двигать. Непонятно всё-же чего он ничего не рисует?

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
LRESULT CALLBACK HelloWorldProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam) {
    HDC hDC; PAINTSTRUCT PaintStruct; RECT Rect; int user_reply; POINT pos;
    switch(Message) {
    case WM_CREATE:
        InitializeCriticalSection(&cursor_handling_section);
        InterlockedIncrement(&window_number);
        hChild = CreateWindow (L"EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER| ES_AUTOHSCROLL, 20, 100, 100, 20, hWnd, (HMENU)1, H_INSTANCE, NULL);
        if(!hChild) MessageBox(hWnd, L"cannot create EDIT", L"Error", MB_OK);
        return 0;
    case WM_SETCURSOR: { //WM_MOUSEMOVE
        EnterCriticalSection(&cursor_handling_section);
        hDC=BeginPaint(hWnd, &PaintStruct); SetBkMode(hDC, TRANSPARENT);
        GetClientRect(hWnd, &Rect); GetCursorPos(&pos);
        cml::ustring x_pos(cml::intToWch(pos.x)); x_pos.addBefore(L"x=",1);
        x_pos.addAfter(L", ",x_pos.getLen());
        cml::ustring y_pos(cml::intToWch(pos.y)); y_pos.addBefore(L"y=",1);
        DrawText(hDC, x_pos+y_pos, -1, &Rect, DT_CENTER | DT_VCENTER /* | DT_SINGLELINE */);
        EndPaint(hWnd, &PaintStruct);
        LeaveCriticalSection(&cursor_handling_section);
        InterlockedIncrement(&message_counter);
        return 0;
    }
    case WM_PAINT:
        hDC=BeginPaint(hWnd, &PaintStruct); SetBkMode(hDC, TRANSPARENT);
        GetClientRect(hWnd, &Rect);
        DrawText(hDC, L"嬉しい事、悲しい事も、\nе…ЁйѓЁдёёг‚ЃгЃ¦гЂ‚", -1, &Rect, DT_CENTER | DT_VCENTER /* | DT_SINGLELINE */);
        EndPaint(hWnd, &PaintStruct);
        return 0;
    case WM_CLOSE:
        if(window_number>1) user_reply=MessageBox(hWnd, L"Close window?", L"Request", MB_YESNO | MB_ICONQUESTION);
        else user_reply=MessageBox(hWnd, L"Are you sure?", L"Exit", MB_YESNO | MB_ICONQUESTION);
        if(IDYES==user_reply) { window_number--; DestroyWindow(hWnd); }
        MessageBox(0, cml::intToWch(message_counter), L"count=", MB_OK);
        return 0;
    case WM_DESTROY:
        if(window_number==0) PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd, Message, wParam, lParam);
    }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.01.2013, 02:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему ничего не рисуется при получении? (C++ WinAPI):

Почему после нажатия на кнопку ничего не происходит?
1) почему после нажатия на кнопку ничего не происходит, и почему она сразу не...

Ошибка при получении владельца файла
setlocale(LC_ALL, "ru"); HANDLE hFile = CreateFile(L"file.exe",...

Как создать 2 скроллбара, и различить их при получении события?
Как создать 2 горизонтальных скроллбара? И как потом получать события и...

При получении текста из буфера обмена не распознаются русские символы
текст из буфера обмена получаю таким образом: char* buffer;...

При получении WM_ENDSESSION Windows не дает корректно завершить программу
Всем привет! В моем приложении есть скрытое окно, которое получает от винды...

В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?
Здравствуйте.Не могу получить адрес функции из dll с помощью функции...

1
TurboDune
23 / 23 / 3
Регистрация: 20.02.2009
Сообщений: 59
29.01.2013, 09:36 #2
Согласно правилам хорошего тона, рисовать надо ТОЛЬКО при приёме сообщения WM_PAINT. Все остальные обработчики могут лишь указать окну облать, необходимую для перерисовки, например функцией InvalidateRect.

Но если ты хочешь отступить от этих правил, надо делать так:
C++
1
2
3
HDC hdc = ::GetDC(hWnd);
DrawSome(hdc);
::ReleaseDC(hdc);
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 09:36
Привет! Вот еще темы с решениями:

Почему ничего не рисуется?
Почему ничего не рисуется? #include "widget.h" #include "ui_widget.h"...

Почему ничего не рисуется?
Показывается черное окно с FPS и все. SharpGL using SharpGL; using...

Ничего не рисуется
//==============================================================================...

Не рисуется ничего
в общем определила функции create для 3х фигур Круг: virtual void...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru