Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
63 / 58 / 13
Регистрация: 24.07.2011
Сообщений: 343
1

Помогите с сообщением WM_PAINT

24.10.2011, 00:00. Показов 3475. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем.создал класс который рисует окружность внутри квадрата и выводит на экран это все хозяйство.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class zvezda
{
public:
    void show(HDC dc,int x1,int y1,int x2,int y2);
private:
    HDC dc;
    int x1;
    int y1;
    int x2;
    int y2;
};
 
void zvezda::show(HDC dc,int x1,int y1,int x2,int y2)
{
    Rectangle(dc,x1,y1,x2,y2);
    Ellipse(dc,x1,y1,x2,y2);
}
Теперь я хочу нажимая на экран двигать данную "картинку" по рабочей области.Для этого использую 4 сообщения:WM_MOUSEMOVE(чтобы постоянно брать координаты мыши),WM_LBUTTONDOWN(чтобы нельзя было водить по экрану картинку пока не зажму кнопку мыши),WM_LBUTTONUP(чтобы когда отпустил кнопку мыши,то прекратилось все),WM_PAINT(рисует данную картинку в нужных мне координатах)

вот код:
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  WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT paint;
    bool fl=false;
    static POINT cp;
    static int x2=230;
    static int y2=140;
    zvezda p;
    switch(uMsg)
{
    case WM_MOUSEMOVE:
        if (fl)
        {   
         GetCursorPos(&cp);
         UpdateWindow(hWnd);
        }
    break;
 
    case WM_LBUTTONDOWN:
        fl=true;
    break;
    
    case WM_LBUTTONUP:
        fl=false;
    break;
 
    
    case WM_PAINT:
        MyObject.dc=BeginPaint(hWnd,&paint);
        p.show(MyObject.dc,cp.x,cp.y,x2+cp.x,y2+cp.y);
        EndPaint(hWnd,&paint);
    break;
    
 
case WM_DESTROY:
PostQuitMessage(0);
break;
 
default:
return(DefWindowProc(hWnd,uMsg,wParam,lParam)) ; 
}
}
Но че то он не работает.Картинку выводит..но не хочет таскать ее по экрану..помогите плизз(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2011, 00:00
Ответы с готовыми решениями:

Помогите с MFC. Не могу разобраться с WM_PAINT
Здраствуйте. Если я провожу по окну своей программы другим окном то стираются все кнопки, поля...

WM_PAINT
На главном окне- статик. По сообщению WM_PAINT и при необходимости рисую на нем. Все как описано не...

WM_PAINT и tpanel
Как отслеживать в 2007 сообщение WM_Paint для tpanel Пишу код procedure WMPAINT(var Msg:...

WM_PAINT зацикливается
Подскажите, пожалуйста, с обработкой сообщения перерисовки. Вот так нормально работает без...

2
23 / 23 / 7
Регистрация: 30.01.2009
Сообщений: 103
24.10.2011, 00:09 2
попробуй через InvalidateRect где-то так
C++
1
2
3
4
5
6
7
8
9
10
11
        
...
case WM_MOUSEMOVE:
                if (fl)
                {   
                 GetCursorPos(&cp);
                 InvalidateRect(hWnd, &Star, TRUE);
                 UpdateWindow(hWnd);
                }
        break;
...
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.10.2011, 02:20 3
bretba, посмотри привёл пример кода перетаскивание прямоугольника.
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){    
    PAINTSTRUCT  paint;
    HGDIOBJ old, old1;
    RECT rect;
    HDC hdc;
    // для примера
    static RECT   cur, tmp;
    static POINT  pos, pt;
    static int    size  = 100;
    static HBRUSH brush = NULL;
    static BOOL   drag  = FALSE;
 
    switch (message) {
     case WM_CREATE: 
           pos.x = pos.y = 100L;
           SetRect(&cur, pos.x, pos.y, pos.x + size, pos.y + size);
           SetRectEmpty(&tmp);
           brush = CreateSolidBrush(RGB(0, 200, 0));
         break;
     case WM_PAINT:
          hdc = BeginPaint(hWnd, &paint);
 
          old1 = SelectObject(hdc, (HGDIOBJ) GetStockObject(NULL_PEN)); 
          old  = SelectObject(hdc, brush);
          Rectangle(hdc, cur.left, cur.top, cur.right, cur.bottom);
          CopyRect(&tmp, &cur);
 
          if(drag) // обрамление фокуса
                DrawFocusRect(hdc, &tmp);
 
          SelectObject(hdc, old);
          SelectObject(hdc, old1);
 
          EndPaint(hWnd, &paint);
          break;
     case WM_LBUTTONDOWN:
          pt.x = LOWORD(lParam);
          pt.y = HIWORD(lParam);
          if(PtInRect(&cur, pt)) {  // проверяем область щелчка
                   drag  = TRUE;   // если попадает включить режим перетаскивания
                    pt.x -= cur.left;
                    pt.y -= cur.top;
          }
          break;
     case WM_LBUTTONUP:  // отмена перетаскивания
            drag = FALSE;
            InvalidateRect(hWnd, &tmp, TRUE);
          break;
      case WM_MOUSEMOVE:
           if((wParam & MK_LBUTTON) && drag) {
                   pos.x = LOWORD(lParam) - pt.x;
                   pos.y = HIWORD(lParam) - pt.y;
                   InvalidateRect(hWnd, &tmp, TRUE);
                   SetRect(&cur, pos.x, pos.y, pos.x + size, pos.y + size);
            }
         break;
       case WM_DESTROY:
             DeleteObject(brush);
       PostQuitMessage(0);
      break;
      default:  return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
0
24.10.2011, 02:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2011, 02:20
Помогаю со студенческими работами здесь

OpenGL + WM_PAINT
У меня нет доступа к HWND окна. Есть только доступ к событию WM_PAINT и HDC, полученного в...

В WM_PAINT не обновляется
В событиях WM_KEYDOWN и классе, где изменяется переменная, переменная изменяется. Т.е код на вывод...

Виснет WM_PAINT
Я долго ломал голову как мне сделать OnPaint чтобы ничего не тормозило и отрисоввывалось быстро....

Перерисовка окна WM_PAINT
Добрый вечер. Кто подскажет как в нужный момент перерисовать окно? Как я понимаю нужно вызвать...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru