Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2010, 12:25   #1
AndreyPik
Новичок
Джуниор
 
Регистрация: 21.11.2010
Сообщений: 2
По умолчанию Проблема с рисованием в заголовке

Недавно начал изучать WinAPI и пытаюсь нарисовать текст в заголовке окна. Но если рисовать не в WM_NCPAINT то нарисованного невидно(скорей всего поверх него рисуется рамка). А если рисовать при обработке WM_NCPAINT то текст рисуется, а дефолтная рамка нет. Если в WM_NCPAINT сначала вызвать DefWindowProc, а потом нарисовать, то нарисованного всё равно не видно.
Может быть нужно рисовать при обработке другого сообщения или рисовать какой-нибудь другой функцией?
Вот мой код:
Код:
#include <Windows.h>

BOOL RegClass(WNDPROC WndProc, LPCWSTR szClassName, UINT bgColor);
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
HINSTANCE hInstance;

LPCWSTR szClassName=L"DrawInFrame";
LPCWSTR szTitle=L"";

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
	MSG msg; HWND hwnd;
	hInstance=hInst;
	if (!RegClass(WndProc, szClassName, COLOR_WINDOW) ) return false;
	if (!(hwnd=CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW|WS_VISIBLE,
		190, 150, 400, 300, 
		0,0, hInstance, NULL
		)) ) return false;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCWSTR szClassName, UINT brBackgroundColor)
{
	WNDCLASSEX wcex;
	wcex.cbClsExtra=0;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.cbWndExtra=0;
	wcex.style =CS_HREDRAW|CS_VREDRAW;
	wcex.hInstance=hInstance;
	wcex.hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION) );
	wcex.hCursor=LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW) );
	wcex.hbrBackground=(HBRUSH)(brBackgroundColor);
	wcex.lpszMenuName=0;
	wcex.lpszClassName=szClassName;
	wcex.hIconSm=LoadIcon( hInstance, MAKEINTRESOURCE(IDI_APPLICATION) );
	wcex.lpfnWndProc=Proc;

	return RegisterClassEx(&wcex)!=0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static WCHAR szText[]=L"Заголовок";
	switch (msg)
	{
		case WM_NCPAINT:
		{
			//DefWindowProc(hwnd, msg, wParam, lParam);
			HDC hdc=GetWindowDC(hwnd);
			SetTextColor(hdc,RGB(255,0,0));
			SetBkMode(hdc,TRANSPARENT);
			TextOut(hdc,30,3,szText,wcslen(szText));
			ReleaseDC(hwnd,hdc);
			return 0;
		}
		case WM_DESTROY: {PostQuitMessage(0); return 0;}
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

Последний раз редактировалось rpy3uH; 21.11.2010 в 16:28.
AndreyPik вне форума Ответить с цитированием
Старый 21.11.2010, 18:20   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Если в WM_NCPAINT сначала вызвать DefWindowProc, а потом нарисовать, то нарисованного всё равно не видно.
Хм... А у меня нормально рисуется...

Правда код сначала не хотел компилироваться, у меня C++ какой-то левый...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 21.11.2010, 21:48   #3
AndreyPik
Новичок
Джуниор
 
Регистрация: 21.11.2010
Сообщений: 2
Злость

Может это из-за студии 10 или ещё из-за чего? У меня в книжке Ганеева есть пример, там вроде должно быть правильно. Там перерисовывают на WM_MOVE и WM_SIZE. Но у меня и так не работает.
Причём если получать GetWindowDC(hwnd) и выводить в рабочую область, то нормально, а если во фрейм, то нету ничего.
А если получать GetWindowDC(0), то текст рисуется, но фон вместо прозрачного чёрный и шлейф остаётся.
Короче даже не знаю где причину искать.

Попробовал запустить exe-шник в XP - всё работает как надо. Только при перекрытии окна другим WM_NCPAINT не посылается, приходится ловить WM_PAINT (Так и должно быть?).
Получается, это какая-то особенность семёрки. Может кто-нибудь знает?

Последний раз редактировалось Stilet; 22.11.2010 в 09:59.
AndreyPik вне форума Ответить с цитированием
Старый 22.11.2010, 14:47   #4
Exception
Пользователь
 
Регистрация: 31.12.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от AndreyPik Посмотреть сообщение
Получается, это какая-то особенность семёрки.
Если не ошибаюсь надо смотреть в сторону DWM функций.
Exception вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рисованием на Timage Delphi7 Dalagardi Помощь студентам 1 19.04.2010 20:48
Проблема с рисованием на canvas`e Timage (Delphi) Dalagardi Помощь студентам 9 25.03.2010 20:55
Проблема с рисованием на канве в TPaintBox pro100-delphi Помощь студентам 10 09.03.2010 19:41
проблема с рисованием сферы kady Помощь студентам 14 25.01.2010 17:48
Проблема с рисованием прямоугольника Юра. Общие вопросы Delphi 13 04.08.2007 06:08