Форум программистов CodeGuru
23 Август 2017, 06:13:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: GDI+ & WM_NCPAINT в C++  (Прочитано 18944 раз)
0 Пользователей и 1 Гость смотрят эту тему.
shranet
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« : 13 Июнь 2011, 10:37:26 »

Привет. У меня первый пост в http://forum.codeguru.ru. (Я по русски не очень)

Проблема: Если меняешь размер окна, текст окна исчезают и снова появляется.
Как можно рисовать, как стандартным окна Windows?
Код:
VOID Window::OnNcPaint(HRGN hRgn)
{
    HDC hdc = GetDCEx(this->hWnd, hRgn, DCX_WINDOW | DCX_INTERSECTRGN | DCX_CACHE | DCX_CLIPSIBLINGS);
    Graphics graphics(hdc);
    RECT rc;
    GetWindowRect(hWnd, &rc);
    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    graphics.FillRectangle(linGrhHeader, 0, 1, width, 10);
    graphics.FillRectangle(solidBrush, 0, 10, width, g_HeaderHeight - 10);
   
    if (this->windowText != NULL)
    {
        RectF rectF(10.0f, 0.0f, width, g_HeaderHeight);
        graphics.DrawString(this->windowText, -1, font, rectF, stringFormat, headerTextBrush);
    }
}
Записан
shranet
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« Ответ #1 : 13 Июнь 2011, 14:08:58 »

Проблема решено
Код:
void OnNcPaint(HWND hWnd, HRGN hRgn)
{
HDC hdc = GetWindowDC(hWnd);

RECT rc;
GetWindowRect(hWnd, &rc);

int width = rc.right - rc.left;
int height = rc.bottom - rc.top;

HDC hMemory = CreateCompatibleDC(hdc);
HBITMAP hBmp = CreateCompatibleBitmap(hdc, width, height);
HBITMAP oldBmp = (HBITMAP)SelectObject(hMemory, hBmp);
Graphics graphics(hMemory);

LinearGradientBrush linGrhRight(
Rect(width - g_WindowPadding - 1, g_HeaderHeight, g_WindowPadding, height - g_WindowPadding),
*currentColor,
Color(255, 255, 255, 255), 180.0f, FALSE);

LinearGradientBrush linGrhHeader(
Point(0, 0),
Point(0, 10),
Color(255, 255, 255, 255),   // opaque red
*currentColor);

    LinearGradientBrush linGrhLeft (
Point(0, 0),
Point(g_WindowPadding, 0),
*currentColor,
Color(255, 255, 255, 255));

graphics.DrawLine(pen, 0, 0, width, 0);


graphics.FillRectangle(&linGrhHeader, 0, 1, width, 10);

graphics.FillRectangle(solidBrush, 0, 10, width, g_HeaderHeight - 10);

graphics.FillRectangle(&linGrhLeft, 0, g_HeaderHeight,
g_WindowPadding, height - g_HeaderHeight - g_WindowBottomHeight - g_WindowPadding);

graphics.FillRectangle(solidBrush, 0, height - g_WindowBottomHeight - g_WindowPadding,
g_WindowPadding, g_WindowBottomHeight);

graphics.FillRectangle(&linGrhRight, width - g_WindowPadding, g_HeaderHeight,
g_WindowPadding, height - g_WindowBottomHeight - g_WindowBottomHeight - g_WindowPadding);

graphics.FillRectangle(solidBrush, width - g_WindowPadding, height - g_WindowBottomHeight - g_WindowPadding,
g_WindowPadding, g_WindowBottomHeight);

graphics.FillRectangle(solidBrush, 0, height - g_WindowPadding, width, g_WindowPadding);

RectF rectF(10.0f, 0.0f, (float)width, (float)g_HeaderHeight);
graphics.DrawString(L"Window Caption", -1, font, rectF, stringFormat, headerTextBrush);

BitBlt(hdc, 0, 0, width, 30, hMemory, 0, 0, SRCCOPY);
BitBlt(hdc, 0, 0, g_WindowPadding, height, hMemory, 0, 0, SRCCOPY);
BitBlt(hdc, width - g_WindowPadding, 0, g_WindowPadding, height, hMemory, 0, 0, SRCCOPY);
BitBlt(hdc, 0, height - g_WindowPadding, width, g_WindowPadding, hMemory, 0, height - g_WindowPadding, SRCCOPY);

SelectObject(hdc, oldBmp);

DeleteDC(hMemory);
DeleteDC(hdc);
DeleteObject(hBmp);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!