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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2009, 20:11   #1
qwerty09
Пользователь
 
Регистрация: 08.07.2009
Сообщений: 11
По умолчанию Пример из книги не работает

Из книги Герберта Шилдта "Искусство программирования". Среда - VS 2008. Запускаю, никаких ошибок, вот только не открывается окно приложения. Чего тут не хватает?
Код:
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR args, int winMode )
{
	HWND hwnd;
	MSG msg;
	WNDCLASSEX wcl;
	HACCEL hAccel;

	wcl.cbSize = sizeof(WNDCLASSEX);
	wcl.hInstance = hThisInst;
	wcl.lpszClassName = "MyWin";
	wcl.lpfnWndProc = WindowFunc;
	wcl.style = 0;
	wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcl.hIconSm = NULL;
	wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcl.lpszMenuName = "ThreadAppMenu";
	wcl.cbClsExtra = 0;
	wcl.cbWndExtra = 0;
	wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

	if (!RegisterClassEx(&wcl)) return 0;

	hwnd = CreateWindow( 
		wcl.lpszClassName,
		"Using a Thread Control Panel",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		260,
		200,
		NULL,
		NULL,
		hThisInst,
		NULL
		);
	
	hInst = hThisInst;

	hAccel = LoadAccelerators(hThisInst, "ThreadAppMenu");

	ShowWindow(hwnd, winMode);
	UpdateWindow(hwnd);

	while(GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(hwnd, hAccel, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}
qwerty09 вне форума Ответить с цитированием
Старый 17.08.2009, 20:17   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

А где функция обработки сообщений?
psycho-coder вне форума Ответить с цитированием
Старый 17.08.2009, 20:18   #3
qwerty09
Пользователь
 
Регистрация: 08.07.2009
Сообщений: 11
По умолчанию

функция обработки сообщений:
Код:
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int response;
	switch(message)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_THREAD:
			hThread1 = (HANDLE) _beginthreadex(NULL, 0, MyThread1, (void *) hwnd, 0, &tid1 );
			hThread2 = (HANDLE) _beginthreadex(NULL, 0, MyThread2, (void *) hwnd, 0, &tid2 );
			break;
		case IDM_PANEL:
			ThrdCtrlPanel(hInst,hThread1);
			ThrdCtrlPanel(hInst,hThread2);
			break;
		case IDM_HELP:
			MessageBox(hwnd, "F1: Help\nF2: Start Threads\nF3: Panel", "Help", MB_OK);
			break;
		case IDM_EXIT:
			response = MessageBox(hwnd,"Quit the Program?", "Exit", MB_YESNO);
			if (response==IDYES) PostQuitMessage(0);
			break;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
defalut:
		return DefWindowProc(hwnd, message, wParam,lParam);
	}

	return 0;
}
qwerty09 вне форума Ответить с цитированием
Старый 17.08.2009, 20:48   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int response;
	switch(message)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_THREAD:
			hThread1 = (HANDLE) _beginthreadex(NULL, 0, MyThread1, (void *) hwnd, 0, &tid1 );
			hThread2 = (HANDLE) _beginthreadex(NULL, 0, MyThread2, (void *) hwnd, 0, &tid2 );
			break;
		case IDM_PANEL:
			ThrdCtrlPanel(hInst,hThread1);
			ThrdCtrlPanel(hInst,hThread2);
			break;
		case IDM_HELP:
			MessageBox(hwnd, "F1: Help\nF2: Start Threads\nF3: Panel", "Help", MB_OK);
			break;
		case IDM_EXIT:
			response = MessageBox(hwnd,"Quit the Program?", "Exit", MB_YESNO);
			if (response==IDYES) PostQuitMessage(0);
			break;
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
defalut: // default
		return DefWindowProc(hwnd, message, wParam,lParam);
	}

	return 0;
}
psycho-coder вне форума Ответить с цитированием
Старый 17.08.2009, 20:55   #5
qwerty09
Пользователь
 
Регистрация: 08.07.2009
Сообщений: 11
По умолчанию

Ничего не изменилось. Студия находится в состоянии "Running", TaskManager показывает, что программа выполняется. Но окна приложения нет.
qwerty09 вне форума Ответить с цитированием
Старый 17.08.2009, 21:19   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Код:
ShowWindow(hwnd, SW_SHOW);
или SW_SHOWNORMAL

И еще - у вас меню в ресурсах находится? Если да, то код
Код:
wcl.lpszMenuName = "ThreadAppMenu";
не сработает
Нужно писать вот так
Код:
wcl.lpszMenuName = MAKEINTRESOURCE(ThreadAppMenu);
это стандартный виндовый макрос, который достает из ресурсов разные компоненты

Последний раз редактировалось MaTBeu; 17.08.2009 в 21:24.
MaTBeu вне форума Ответить с цитированием
Старый 17.08.2009, 21:33   #7
qwerty09
Пользователь
 
Регистрация: 08.07.2009
Сообщений: 11
По умолчанию

Написал:
wcl.lpszMenuName = MAKEINTRESOURCE(ThreadAppMenu);
и получил ошибку:
'ThreadAppMenu' : undeclared identifier

Вот содержимое файла ресурса:
Код:
#include <windows.h>
#include "thrdapp.h"
#include "tcp.rc"

ThreadAppMenu MENU
{
	POPUP "&Threads" {
		MENUITEM "&Start Threads\tF2", IDM_THREAD
			MENUITEM "&Control Panels\tF3", IDM_PANEL
			MENUITEM "E&xit\tCtrl+X", IDM_EXIT
	}
	MENUITEM "&Help", IDM_HELP
}

ThreadAppMenu ACCELERATORS
{
	VK_F1, IDM_HELP, VIRTKEY
	VK_F2, IDM_THREAD, VIRTKEY
	VK_F3, IDM_PANEL, VIRTKEY
	"^X", IDM_EXIT
}
qwerty09 вне форума Ответить с цитированием
Старый 17.08.2009, 21:55   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А, я думал вы создавали при помощи редактора ресурсов.
MaTBeu вне форума Ответить с цитированием
Старый 17.08.2009, 22:32   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Я пробовал без ресурсов.
Код:
#include <windows.h>

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam,lParam);
	}

	return 0;
}


int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR args, int winMode )
{
	HWND hwnd;
	MSG msg;
	WNDCLASSEX wcl;
	HACCEL hAccel;
	LPCWSTR classname = L"MyWin";

	wcl.cbSize = sizeof(WNDCLASSEX);
	wcl.hInstance = hThisInst;
	wcl.lpszClassName = classname;
	wcl.lpfnWndProc = WindowFunc;
	wcl.style = NULL;
	wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcl.hIconSm = NULL;
	wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcl.lpszMenuName = NULL;
	wcl.cbClsExtra = 0;
	wcl.cbWndExtra = 0;
	wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

	if (!RegisterClassEx(&wcl)) return 0;

	hwnd = CreateWindow( 
		classname,
		L"Using a Thread Control Panel",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		260,
		200,
		NULL,
		NULL,
		hThisInst,
		NULL
		);

	ShowWindow(hwnd, winMode);
	UpdateWindow(hwnd);

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

	return msg.wParam;
}
Visual Studio 2005
psycho-coder вне форума Ответить с цитированием
Старый 17.08.2009, 22:58   #10
qwerty09
Пользователь
 
Регистрация: 08.07.2009
Сообщений: 11
По умолчанию

Да, этот код действительно работает. Спасибо.

Последний раз редактировалось qwerty09; 17.08.2009 в 23:04.
qwerty09 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает пример самосоединения motya770 SQL, базы данных 2 01.07.2009 00:11
Пример из книги Керниган, Ричи. Язык C. Массивы hukola Общие вопросы C/C++ 16 26.05.2009 18:04
Пример из книги Cpluser Общие вопросы .NET 7 13.04.2009 14:39
Технология JNI, не работает пример :( lexluther Общие вопросы по Java, Java SE, Kotlin 0 23.11.2008 02:48
Пример из книги,помогите найти ошибку. ANTI Win Api 4 04.06.2008 23:59