Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
1

Двойная буферизация, присутствует мерцание

05.08.2012, 18:12. Просмотров 4529. Ответов 32
Метки нет (Все метки)

Здравствуйте!
Если форма на C++ (чистый WinAPI), на ней рисуется графика с помощью GDI+.
Форма обновляется каждые 100мс., но вот беда она мерцает.
Код отрисовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
VOID OnPaint(HDC hdc)
{
   Graphics     graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font         font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF         pointF(10.0f, 20.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game)
        graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
}
Само рисование формы и применение буферизации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case WM_PAINT:
  {
   HDC hdc;
   PAINTSTRUCT ps;
   ULONG_PTR gdiplusToken;
   HDC mdc = CreateCompatibleDC(NULL);
   HBITMAP mbmp =  CreateBitmap(420,320,1,8,NULL);
   HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);
   hdc = BeginPaint(hWnd, &ps);
   GdiplusStartupInput gdiplusStartupInput;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   {
        OnPaint(hdc);
   }
   SelectObject(mdc,moldbmp);
   DeleteObject(mbmp);
   DeleteDC(mdc);
   EndPaint(hWnd, &ps);
  }
  break;
И собственно говоря код, который вызывает обновление:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case WM_TIMER:
  {
   if (ME->GetProcessByName() != 0)
   {
        is_game = true;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
   else
   {
        is_game = false;
        RECT rect = {0, 0, 420, 320};
        InvalidateRect(hWnd, &rect, false);
   }
  }
  break;
Как я могу устранить мерцание элементов формы? Может что-то не так с буферизацией?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2012, 18:12
Ответы с готовыми решениями:

Двойная буферизация!
Пишу очень облегченное и просто подобие старого Пеинта, но столкнулся с одной...

Двойная буферизация под Win на VC++ (MFC)
Двойная буферизация под Win на VC++(MFC) - кто-нибудь знает - это вообще...

Двойная компиляция
Всем привет! При компиляции на VS2010 происходит двойной запуск программы. ...

Мерцание консоли
Пишу RPG. Но возникла такая проблема: когда персонаж двигается, начинает...

Мерцание при Invalidate
(MFC) Вызываю в OnMouseMove MoveWindow(SetWindowPos (отключаю перерисовку))...

32
Игорь с++
473 / 465 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 18:20 2
вот накидал по быстрому , смотри , что у тебя не так
1
Вложения
Тип файла: rar Нет мерцание.rar (30.8 Кб, 118 просмотров)
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 18:31  [ТС] 3
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот накидал по быстрому , смотри , что у тебя не так
Суть в том, что я рисую текст, а не картинки, и положить его в буфер никак не могу.
C++
1
2
3
4
5
6
7
8
9
10
HDC mdc = CreateCompatibleDC(NULL);
HBITMAP mbmp =  CreateBitmap(420, 320, 1, 8, NULL);
HBITMAP moldbmp = (HBITMAP)SelectObject(mdc, mbmp);
hdc = BeginPaint(hWnd, &ps);
//drawing
BitBlt(hdc,0,0,420,320,mdc,0,0,SRCCOPY);
SelectObject(mdc,moldbmp);
DeleteObject(mbmp);
DeleteDC(mdc);
EndPaint(hWnd, &ps);
Поэтому всю форму я обрабатываю как один bitmap.
0
Игорь с++
473 / 465 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 18:38 4
вот тебе картинка + текст
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <windows.h>
#include "dll.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_POPUPWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           50,                 /* The programs width */
           50,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
 
static int x=15;static char x2[10]={0};
 
HDC hdc;
 
static HDC memBit[2];
 
static HBITMAP hBitmap[2];
 
RECT rect;
 
static HBITMAP bmpMem;
    switch (message)                  /* handle the messages */
    {
           case WM_CREATE:
                
    SetTimer(hwnd,1,1000,NULL);
                
                break;
           
           
case WM_TIMER:
     
hBitmap[1]=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);//Г§Г*ãðóæГ*ГҐГ¬ ГЄГ*ðòèГ*ГЄГі
 
hdc = GetDC(hwnd);//êëèåГ*ГІГ±ГЄГ*Гї îáëГ*Г±ГІГј
 
memBit[1] = CreateCompatibleDC(hdc);//ГЄГ®Г*ГІГҐГЄГ±ГІ óñòðîéñòâГ* äëÿ ГЄГ®Г*ГІГҐГЄГ±ГІГ* 1
memBit[2] = CreateCompatibleDC(hdc);//ГЄГ®Г*ГІГҐГЄГ±ГІ óñòðîéñòâГ* äëÿ ГЄГ®Г*ГІГҐГЄГ±ГІГ* 2
 
bmpMem = CreateCompatibleBitmap (hdc, 600, 400);//ñîçäГ*Г*ГЁГҐ âèðòóГ*ëüГ*îãî ГґГ*éëГ* .bmp
 
//êîïèðóåì ГґГ®Г* ГЄГ®Г*ГІГҐГЄГ±ГІ
SelectObject(memBit[1],hBitmap[1]);//âûáèðГ*ГҐГ¬ âèðò. ГЄГ®Г*ГІ.1 ГЁ ГЄГ*ðòèГ*ГЄГі1
BitBlt(memBit[1],0,0,600,400,memBit[1],0,0,SRCCOPY);//êîïèðóåì Г*Г* âèðòóГ*ëüГ*ûé ГЄГ®Г*ГІГҐГЄГ±ГІ , âûáð.ГЄГ*Г°.
 
SelectObject(memBit[2],bmpMem);//âûáèðГ*ГҐГ¬ îñГ*îâГ*îé âèðò. ГЄГ®Г*. ГЁ âèðò. ГЄГ*ðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. ГЁГ§ âèðò.ГЄГ®Г*ГІ1 Гў ГўГЁГ°. îñГ*îâ.
 
SelectObject(memBit[1],NULL);
SetBkMode(memBit[1],TRANSPARENT);
   SetTextColor(memBit[1],RGB(0,0,255));
TextOut(memBit[1],17,18,x2,strlen(x2));
 
SelectObject(memBit[2],bmpMem);//âûáèðГ*ГҐГ¬ îñГ*îâГ*îé âèðò. ГЄГ®Г*. ГЁ âèðò. ГЄГ*ðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. ГЁГ§ âèðò.ГЄГ®Г*ГІ1 Гў ГўГЁГ°. îñГ*îâ.
 
InvalidateRect(hwnd,NULL,FALSE);
itoa(CpuUsage(x),x2,10);
break;
        
        case WM_PAINT:
     
hdc=BeginPaint(hwnd,&ps);
 
SelectObject(memBit[2],bmpMem);
BitBlt(hdc,0,0,600,400,memBit[2],0,0,SRCCOPY);
 
EndPaint(hwnd,&ps);
 
     break;
                
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
но у меня там функция , которая выводит цифры , а ты замени на текст
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 18:53  [ТС] 5
Цитата Сообщение от Игорь с++ Посмотреть сообщение
вот тебе картинка + текст
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <windows.h>
#include "dll.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */
 
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;
 
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_POPUPWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           50,                 /* The programs width */
           50,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
 
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
 
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}
 
 
/*  This function is called by the Windows function DispatchMessage()  */
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
 
static int x=15;static char x2[10]={0};
 
HDC hdc;
 
static HDC memBit[2];
 
static HBITMAP hBitmap[2];
 
RECT rect;
 
static HBITMAP bmpMem;
    switch (message)                  /* handle the messages */
    {
           case WM_CREATE:
                
    SetTimer(hwnd,1,1000,NULL);
                
                break;
           
           
case WM_TIMER:
     
hBitmap[1]=(HBITMAP)LoadImage(NULL,"1.bmp",IMAGE_BITMAP,50,50,LR_LOADFROMFILE);//Г§Г*ãðóæГ*ГҐГ¬ ГЄГ*ðòèГ*ГЄГі
 
hdc = GetDC(hwnd);//êëèåГ*ГІГ±ГЄГ*Гї îáëГ*Г±ГІГј
 
memBit[1] = CreateCompatibleDC(hdc);//ГЄГ®Г*ГІГҐГЄГ±ГІ óñòðîéñòâГ* äëÿ ГЄГ®Г*ГІГҐГЄГ±ГІГ* 1
memBit[2] = CreateCompatibleDC(hdc);//ГЄГ®Г*ГІГҐГЄГ±ГІ óñòðîéñòâГ* äëÿ ГЄГ®Г*ГІГҐГЄГ±ГІГ* 2
 
bmpMem = CreateCompatibleBitmap (hdc, 600, 400);//ñîçäГ*Г*ГЁГҐ âèðòóГ*ëüГ*îãî ГґГ*éëГ* .bmp
 
//êîïèðóåì ГґГ®Г* ГЄГ®Г*ГІГҐГЄГ±ГІ
SelectObject(memBit[1],hBitmap[1]);//âûáèðГ*ГҐГ¬ âèðò. ГЄГ®Г*ГІ.1 ГЁ ГЄГ*ðòèГ*ГЄГі1
BitBlt(memBit[1],0,0,600,400,memBit[1],0,0,SRCCOPY);//êîïèðóåì Г*Г* âèðòóГ*ëüГ*ûé ГЄГ®Г*ГІГҐГЄГ±ГІ , âûáð.ГЄГ*Г°.
 
SelectObject(memBit[2],bmpMem);//âûáèðГ*ГҐГ¬ îñГ*îâГ*îé âèðò. ГЄГ®Г*. ГЁ âèðò. ГЄГ*ðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. ГЁГ§ âèðò.ГЄГ®Г*ГІ1 Гў ГўГЁГ°. îñГ*îâ.
 
SelectObject(memBit[1],NULL);
SetBkMode(memBit[1],TRANSPARENT);
   SetTextColor(memBit[1],RGB(0,0,255));
TextOut(memBit[1],17,18,x2,strlen(x2));
 
SelectObject(memBit[2],bmpMem);//âûáèðГ*ГҐГ¬ îñГ*îâГ*îé âèðò. ГЄГ®Г*. ГЁ âèðò. ГЄГ*ðò. 
StretchBlt(memBit[2],0,0,600,400,memBit[1],0,0,600,400,SRCCOPY);//êîï. ГЁГ§ âèðò.ГЄГ®Г*ГІ1 Гў ГўГЁГ°. îñГ*îâ.
 
InvalidateRect(hwnd,NULL,FALSE);
itoa(CpuUsage(x),x2,10);
break;
        
        case WM_PAINT:
     
hdc=BeginPaint(hwnd,&ps);
 
SelectObject(memBit[2],bmpMem);
BitBlt(hdc,0,0,600,400,memBit[2],0,0,SRCCOPY);
 
EndPaint(hwnd,&ps);
 
     break;
                
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
но у меня там функция , которая выводит цифры , а ты замени на текст
На форме я так и не увидел никаких цифр (в itoa подставил 5000)...
+ я рисую текст через GDI+
0
Игорь с++
473 / 465 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
05.08.2012, 19:57 6
Цитата Сообщение от Sheppard Посмотреть сообщение
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
ULONG_PTR gdiplusToken;
HDC mdc = CreateCompatibleDC(NULL);
HBITMAP mbmp = CreateBitmap(420,320,1,8,NULL);
HBITMAP moldbmp = (HBITMAP)SelectObject(mdc,mbmp);
вот это уже не верно нельзя всё это вставлять в обработчик WM_PAINT
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:41  [ТС] 7
Игорь с++, код из "Нет мерцание.rar", не позволяет убрать мерцание, проверял на твоих же исходниках, текст отрисованный GDI+ мерцает.
P.S. мне нужно просто обновлять форму без мерцания и всяких Bitmap'ов
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 22:47 8
Sheppard, покажи регистрацию класса окна.
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:51  [ТС] 9
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, покажи регистрацию класса окна.
Вот полный код (проект на чистом WinAPI).
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
#include <Windows.h>
#include <GdiPlus.h>
#include "resource.h"
#include <iostream>
 
#pragma comment (lib, "gdiplus.lib")
using namespace Gdiplus;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // прототип WndProc
 
VOID OnPaint(HDC hdc)
{
   Graphics    graphics(hdc);
   SolidBrush  brush(Color(255, 0, 0, 255));
   FontFamily  fontFamily(L"Times New Roman");
   Font        font(&fontFamily, 24, FontStyleRegular, UnitPixel);
   PointF      pointF(10.0f, 20.0f);
   Bitmap* picture = Bitmap::FromResource(GetModuleHandle(NULL), MAKEINTRESOURCEW(IDB_BITMAP1));
   graphics.DrawImage(picture, 0, 0);
   if (is_game) graphics.DrawString(L"Game is running!", -1, &font, pointF, &brush);
   else graphics.DrawString(L"Game is'nt running!", -1, &font, pointF, &brush);
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS w;
    memset(&w, 0, sizeof(WNDCLASS)); // зарезервировали место под наш класс окна
    w.style = 0;
    w.lpfnWndProc = WndProc; // задали процессс окна
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); // задали белый цвет как фон формы
    w.lpszClassName = "Windows Form"; // Задали класс окна
    RegisterClass(&w); // зарегистрировали наше будующее окно
    hWnd = CreateWindow( w.lpszClassName, "Windows Form", WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, 420, 300, NULL, NULL, hInstance, NULL); // создаём форму
    CreateWindow( "button", "Press me!", WS_CHILD | WS_VISIBLE | BS_CENTER,
        40, 90,
        70, 30,
        hWnd, (HMENU)1, hInstance, 0); // создали кнопку
 
    SetTimer(hWnd, NULL, 100, NULL); // сделали таймер
 
    ShowWindow( hWnd, CmdShow); // показываем наше окно
 
    UpdateWindow (hWnd); // обновляем содержимое окна
 
    while (GetMessage ( &msg, NULL, 0, 0) )
    {
        PeekMessage (&msg, 0, 0, 0, 0x0001);
        TranslateMessage (&msg);
        DispatchMessage(&msg);
    }// настроили отправку сообщений формы, о сообщениях формы можете почитать на MSDN
    return msg.wParam;
}
 
LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    ULONG_PTR gdiplusToken;
    RECT rect;
    switch (msg)
    {
    case WM_DESTROY:  // обработчик закрытия формы
        PostQuitMessage(0);
    case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
            GdiplusStartupInput gdiplusStartupInput;
            GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
            {
                OnPaint(hdc);
            }
            EndPaint(hWnd, &ps);
        }
        break;
 
    case WM_COMMAND: //обработчик разных действий формы, нажатие на кнопку и т.д.
        switch (wParam)
        {
        case 1: // 1 - это HMENU нашей кнопки
            MessageBox(hWnd, "Button pressed", "All right!", MB_OK);
            break;
        }
    case WM_TIMER:
        {
            GetClientRect(hWnd, &rect);
            InvalidateRect(hWnd, &rect, false);
            is_game = true;
        }
        break;
    default:
        return DefWindowProc (hWnd, msg, wParam, lParam);
    }
    return 0;
}
Мне просто нужно сделать обновление формы, без всяких дополнительных изображений и мерцания.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 22:55 10
Sheppard, а мерцает каким цветом? (красным, черным, белым, серым?)
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 22:58  [ТС] 11
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, а мерцает каким цветом? (красным, черным, белым, серым?)
При простом InvalidateRect - белым, при использовании кода из "Нет мерцание.rar" чёрным.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 23:02 12
Попробуй в своем коде закомментировать 34-ю строку:
C
1
// w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
Это не лучший вариант, но должно помочь.
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:04  [ТС] 13
Цитата Сообщение от lazybiz Посмотреть сообщение
Попробуй в своем коде закомментировать 33-ю строку:
C
1
// w.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
Это не лучший вариант, но должно помочь.
Теперь нет белого мерцания, но просто мерцают элементы.
P.S. мне просто нужен пример самой простой двойной буферизации без лишнего кода.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 23:17 14
Цитата Сообщение от Sheppard Посмотреть сообщение
Теперь нет белого мерцания, но просто мерцают элементы.
Ну это как раз потому, что это не лучший вариант))
Дело в том, что я терпеть не могу GDI+, и как он работает я себе не представляю и представлять не хочу... поэтому большем мне тебе помочь не чем.

P.S.:
1. С 49-й по 54-ю строки замени на:
C
1
2
3
4
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
PeekMessage (&msg, 0, 0, 0, 0x0001); там ни к чему.

2. Заместо 89-й и 90-й строки поставь: InvalidateRect( hWnd, NULL, FALSE );

Оппа.. что я нашел.
Ты в курсе, что функция GdiplusStartup() должна вызываться в самом начале программы, а не в WM_PAINT ?
You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown.
И не забудь GdiplusShutdown() в конце программы.

Переделай все это, и, возможно, все встанет на свои места.
0
Somebody
2799 / 1610 / 251
Регистрация: 03.12.2007
Сообщений: 4,213
Завершенные тесты: 3
05.08.2012, 23:23 15
А если попробовать
C++
1
2
case WM_ERASEBKGND:
  return 1;
?
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:24  [ТС] 16
Цитата Сообщение от lazybiz Посмотреть сообщение
Ну это как раз потому, что это не лучший вариант))
Дело в том, что я терпеть не могу GDI+, и как он работает я себе не представляю и представлять не хочу... поэтому большем мне тебе помочь не чем.

P.S.:
1. С 49-й по 54-ю строки замени на:
C
1
2
3
4
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
PeekMessage (&msg, 0, 0, 0, 0x0001); там ни к чему.

2. Заместо 89-й и 90-й строки поставь: InvalidateRect( hWnd, NULL, FALSE );

Оппа.. что я нашел.
Ты в курсе, что функция GdiplusStartup() должна вызываться в самом начале программы, а не в WM_PAINT ?
И не забудь GdiplusShutdown() в конце программы.

Переделай все это, и, возможно, все встанет на свои места.
P.S. поисправлял, но результата нет.
Нужна двойная буферизация и мерцания не будет.

Добавлено через 1 минуту
Цитата Сообщение от Somebody Посмотреть сообщение
А если попробовать
C++
1
2
case WM_ERASEBKGND:
  return 1;
?
Тоже не прокатывает.
Я догадываюсь, то что я должен создавать из формы виртуальный bitmap, обновлять его,и выводить на экран, так по сути и работает двойная буферизация, но рабочего примера я так и не нашёл.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 23:26 17
Sheppard, покажи что получилось. (без WM_ERASEBKGND)
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:29  [ТС] 18
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, покажи что получилось. (без WM_ERASEBKGND)
Да простая форма. Мерцает по интервалу таймера (т.е. по обновлению)
0
Миниатюры
Двойная буферизация, присутствует мерцание  
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
05.08.2012, 23:31 19
Sheppard, я имел в виду код. Кстати, мерцает абсолютно все?

Добавлено через 58 секунд
Цитата Сообщение от Sheppard Посмотреть сообщение
но просто мерцают элементы
Кнопка "Press me!" ?
0
Sheppard
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 48
05.08.2012, 23:32  [ТС] 20
Цитата Сообщение от lazybiz Посмотреть сообщение
Sheppard, я имел в виду код. Кстати, мерцает абсолютно все?
Нет, только текст и кнопка.
Код ты же видел, я его исправил как ты и сказал, большим изменениям он не подвергался.
0
05.08.2012, 23:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2012, 23:32

Анимация огня. Мерцание
Собственно само задание выглядит так: Задание я вроде бы выполнил, но...

Постоянное мерцание при прорисовке
создал класс, в котором реализованы методы для рисования графиков. есть маcсив...

Мерцание при перерисовке (MFC)
Господа Программисты! Делаю Тетрис на MFC. При перерисовке игрового поля...


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

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

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