Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > WINAPI мерцание текста


Автор: zburguy 25.6.2009, 13:49
Начал разбираться с Winapi в книжке пример простого окна в середине которого написан текст.
При изменении размеров окна текст мерцает. Как я понял это происходит из-за перерисовки заднего фона.
Я пробовал отключить перерисовку заднего фона, но при создании окна главная область прозрачная, а когда изменяю размеры вообще что попало выходит.
Вот сам код:

Код

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;

    switch(msg)
    {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        ps.fErase = 0;
        GetClientRect(hWnd, &rect);
        DrawText(hDC, L"Привет", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hWnd, &ps);
    break;

    case WM_DESTROY:
        PostQuitMessage(0);
    break;

    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }

return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg; 

hInst = hInstance;


WNDCLASS wc;

ZeroMemory(&wc, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInst; 
wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = AppName;

RegisterClass(&wc); 

hWnd = CreateWindow(
    AppName, 
    AppName, 
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, 
    200, 300,
    NULL, 
    NULL, 
    hInst, 
    NULL); 

ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

return msg.wParam;
}


Если не тяжело можно пример кода.

Читал, что для этих целей лучше всего использовать буфер, можете привести примерчик буду очень признателен.
Заранее спасибо.

Автор: Andrey44 25.6.2009, 15:06
http://forum.vingrad.ru/forum/topic-249461.html

Автор: zburguy 26.6.2009, 00:23
Я там так и не понял получилось или нет, хоть подтолкните в какую сторону копать.

Автор: Andrey44 26.6.2009, 07:02
zburguy, двойная буфферизация. Вот ответ на твой вопрос.
CreateCompatibleDC
CreateCompatibleBitmap

Автор: GremlinProg 26.6.2009, 11:14
Цитата(zburguy @  26.6.2009,  02:23 Найти цитируемый пост)
Я там так и не понял получилось или нет

да, там получилось
если не понятны детали, то эта тема должна решить все оставшиеся вопросы:
http://forum.vingrad.ru/forum/topic-255037/view-all/index.html
тут примеры полноценных приложений с буферизацией и без

M
GremlinProg

горячие темы, как правило решают больше вопросов, чем требуется,
пользуйтесь поиском с разными ключами,

а чтобы ваши темы можно было быстрее и проще найти, не забывайте вставлять ключевые слова к ней при создании,
либо жмите кнопку "report" и извещайте модераторов с пожеланиями о смене: заголовка темы, описания темы или набора ключевых слов для быстрого поиска темы

Автор: wectula 10.12.2022, 08:00
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)