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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2011, 22:24   #1
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию с++ дочерние окна

Есть такой форточный код. Почему не отрисовываются дочерние окна? Окна вместо символов печатают кракозябры, как исправить? MSDN2010
Код:
#include <Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM);


int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	
	HWND hWnd;			//Дескриптор главного окна программы
	MSG msg;			//Структура для хранения сообщения   
    WNDCLASSEX wc;		//Класс главного окна программы
	
	char ClassPName[] = "ClassParent";
	wc.cbSize		= sizeof(wc);
	wc.style		= CS_HREDRAW | CS_HREDRAW;
	wc.lpfnWndProc	= WndProc;
	wc.cbClsExtra	= 0;
	wc.cbWndExtra	= 0;
	wc.hInstance	= hInstance;
	wc.hIcon		= LoadIcon(NULL, IDI_APPLICATION) ;
	wc.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName= (LPWSTR)ClassPName;
	wc.hIconSm		= LoadIcon (NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wc)){
		MessageBox(NULL,(LPCWSTR) "Can't register class parrent",
			(LPCWSTR) "Error", MB_OK);
		return -1;
	}

	hWnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		(LPWSTR)ClassPName,
		(LPWSTR)"Kursovaya Rabota",
		WS_OVERLAPPEDWINDOW,
		900, 600, 300, 300,
		NULL, NULL,
		hInstance, NULL);
	if(!hWnd){
		MessageBox(NULL,(LPCWSTR) "Can't create parent window",
			(LPCWSTR) "Error", MB_OK);
		return -2;
	}
		
	HWND hChldOM, hChldGM;			
	WNDCLASSEX wchcl;
	
	char ClassChName[]		= "ClassChild";
	wchcl.cbSize			= sizeof(wchcl);
	wchcl.style				= CS_HREDRAW | CS_HREDRAW;
	wchcl.lpfnWndProc		= ChildProc;
	wchcl.cbClsExtra		= 0;
	wchcl.cbWndExtra		= 0;
	wchcl.hInstance			= hInstance;
	wchcl.hIcon				= LoadIcon(NULL, IDI_APPLICATION) ;
	wchcl.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wchcl.hbrBackground		= (HBRUSH)GetStockObject(BLACK_BRUSH);
	wchcl.lpszMenuName		= NULL;
	wchcl.lpszClassName		= (LPWSTR)ClassChName;
	wchcl.hIconSm			= LoadIcon (NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wchcl)){
		MessageBox(NULL,(LPCWSTR) "Can't register child class",
			(LPCWSTR) "Error", MB_OK);
		return -3;
	}

	hChldOM = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		(LPWSTR)ClassChName,
		(LPWSTR)"Graphik operativnoy pamyaty",
		WS_CHILD|WS_BORDER|WS_VISIBLE,
		900, 600, 300, 150,
		hWnd, NULL,
		hInstance, NULL);
	if(!hChldOM){
		MessageBox(NULL,(LPCWSTR) "Can't create child window",
			(LPCWSTR) "Error", MB_OK);
		return -4;
	}
	
	hChldGM = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		(LPWSTR)ClassChName,
		(LPWSTR)"Graphik phizicheskoi pamyzti",
		WS_CHILD|WS_BORDER|WS_VISIBLE,
		900, 300, 300, 150,
		hWnd, NULL,
		hInstance, NULL);
	if(!hChldGM){
		MessageBox(NULL,(LPCWSTR) "Can't create child window",
			(LPCWSTR) "Error", MB_OK);
		return -5;
	}
	
	ShowWindow(hWnd, nCmdShow);
	ShowWindow(hChldOM, nCmdShow);
	ShowWindow(hChldGM, nCmdShow);
	
	while(GetMessage(&msg, NULL, 0, 0)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
		case WM_CREATE:
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}
LRESULT CALLBACK ChildProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if (uMsg == WM_DESTROY )
	{
		return 0;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Alkagolik вне форума Ответить с цитированием
Старый 18.08.2011, 22:43   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Потому что Вы передаёте LPSTR (char*) в функции, которые требуют LPWSTR(wchar_t*). В первую очередь нужно убрать все явные привидения типов к LPWSTR. Строковые литералы нужно предварять символом L
Код:
const wchar_t* wide_string = L"Wide string";
Соответственно, вместо всех char использовать wchar_t.
Ну или просто убрать приведения к LPWSTR, а в настройках проекта указать Multibyte-кодировку.
netrino вне форума Ответить с цитированием
Старый 18.08.2011, 23:27   #3
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

netrino спасибо. с кодировкой уже нашел что делать, дочки отрисовываются, как привязать одну дочку левым нижним углом к левому нижнему углу предка?
Alkagolik вне форума Ответить с цитированием
Старый 18.08.2011, 23:50   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

руками при изменении размеров менять положение дочернего контрола.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.08.2011, 00:11   #5
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Цитата:
руками при изменении размеров менять положение дочернего контрола.
гениально)) как же я не догадался раньше... наверное потому что не в курсе как получить координаты родителя для передачи дочке и обработке в WM_SIZE:
Alkagolik вне форума Ответить с цитированием
Старый 19.08.2011, 00:49   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
	case WM_SIZE: {
		RECT rect;

		GetClientRect(hWnd, &rect);

		MoveWindow(hButton, rect.left + 10, rect.bottom - BUTTON_HEIGHT - 10, BUTTON_WIDTH, BUTTON_HEIGHT, TRUE);

		return 0;
	}
Где BUTTON_HEIGHT - высота кнопки, BUTTON_WIDTH - ширина, 10 - смещение относительно нижнего левого угла. Принцип должен быть понятен.
netrino вне форума Ответить с цитированием
Старый 20.08.2011, 02:40   #7
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Подскажите почему не рисуется график.
Код:
LRESULT CALLBACK ChildProcOM(HWND hChldOM, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	RECT rect;
	HDC hDC;
	PAINTSTRUCT ps;
	static int x, y, tmp, ymax, ymin;
	GetClientRect(hChldOM, &rect);

	ymax = rect.bottom - 10;
	ymin = rect.top +5;
	
	switch(uMsg)
	{
	case WM_CREATE:
		SetTimer(hChldOM, TINER_CHILDOM, 1000, NULL);
		break;
	case WM_TIMER:
		checkOM = true;
		break;
	case WM_PAINT:
		hDC = BeginPaint(hChldOM, &ps);
		GetClientRect(hChldOM, &rect);
		//отрисовка осей координат
		x = rect.left + 10;
		y = rect.bottom - 10;
		SelectObject(hDC, hpen1);
		MoveToEx(hDC, x, y, NULL);
		LineTo(hDC, x, rect.top +5);
		MoveToEx(hDC, x, y, NULL);
		LineTo(hDC, rect.right - 15, y);
		MoveToEx(hDC, x, y, NULL);
		tmp = (y - rect.top + 5)/4;
		MoveToEx(hDC, x, y - tmp, NULL);
		SelectObject(hDC, hpen2);
		LineTo(hDC, rect.right - 15, y - tmp);
		MoveToEx(hDC, x, y - 2 * tmp, NULL);
		LineTo(hDC, rect.right - 15, y - 2 * tmp);
		MoveToEx(hDC, x, y - 3 * tmp, NULL);
		LineTo(hDC, rect.right - 15, y - 3 * tmp);
		//вывод текста
		rect.left = rect.left + 15;
		DrawText(hDC, "Оперативная память", -1, &rect, DT_LEFT | DT_TOP);
		GetClientRect(hChldOM, &rect);
		if (checkOM){
			checkOM = false;
			if (xOM <= rect.left + 10) xOM = rect.right;
			--xOM;
			MEMORYSTATUSEX statex;
			statex.dwLength = sizeof(statex);
			GlobalMemoryStatusEx(&statex);
			yOM = ymax - (ymax - ymin)/(statex.ullTotalPhys/statex.ullAvailPhys);
			SetPixel(hDC, xOM, yOM, RGB(255, 0, 0));
		}
		
		EndPaint(hChldOM, &ps);
		break;
	case WM_DESTROY:
		DeleteObject(hpen1);
		DeleteObject(hpen2);
		KillTimer(hChldOM, TINER_CHILDOM);
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hChldOM, uMsg, wParam, lParam);;
}
Сейчас заметил что рисуется первый пиксел и все.

Последний раз редактировалось Alkagolik; 20.08.2011 в 03:42.
Alkagolik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi, дочерние формы north Общие вопросы Delphi 12 11.11.2010 09:55
Как на WinApi получить все дочерние окна приложения? Wadimka Работа с сетью в Delphi 8 27.05.2009 14:25
Дочерние окна XATAB Общие вопросы Delphi 3 14.11.2007 20:52
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13
Как при скрытом чужом окне сделать его дочерние окна(сообщения) видимыми ? Starwarrior Win Api 1 20.03.2007 09:51