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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2009, 12:13   #1
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию Дескриптор окна

Всем привет! Сижу уже второй день и не пойму где ошибка. Помогите пожалуйста!!! Я не могу получить дескриптор окна.
Работаю в VC++ 2008. Заране благодарю)

Код:
#include <d3d9.h>
#include <d3dx9mesh.h>
#include <stdlib.h>

#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

class Application
{
	HWND hWnd;
	MSG msg;
	IDirect3D9 *pD3D;
	IDirect3DDevice9 *device;

	static LRESULT WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
	bool CreateWnd();

public:
	Application():
	  hWnd(NULL), pD3D(NULL), device(NULL){}
	bool Init();
	void Del();
	void Render();
	void MessagePump();
};

static Application app;		// глобальная переменная

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	if(app.Init())
	{
		app.MessagePump();
		app.Del();
	}
	return 0;
}

bool Application::CreateWnd()
{
	WNDCLASS wc;
	ZeroMemory(&wc, sizeof(wc));

	wc.hbrBackground = (HBRUSH)(6);
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Class";
	wc.style = CS_HREDRAW | CS_VREDRAW;

	if(!RegisterClass(&wc))
		MessageBox(hWnd, "RegisterClass", "Error", MB_OK);

	hWnd = CreateWindow("Class", "Title", WS_OVERLAPPEDWINDOW, 330, 150, 500, 500, 0, NULL, wc.hInstance, 0);

	DWORD a = GetLastError();
	//char b[100];
	//itoa(a,b,10);
	
	if(!hWnd)
	{
		//MessageBox(hWnd, b, "Error", MB_OK);
		return false;
	}

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

	return true;
}

bool Application::Init()
{
	if(!CreateWnd())
	{
		return false;
	}

	pD3D = Direct3DCreate9(D3D_SDK_VERSION);

	if(!pD3D)
	{
		MessageBox(hWnd, "No install DirectX", "Warning", MB_OK);
		return false;
	}

	D3DPRESENT_PARAMETERS pp;
	ZeroMemory(&pp, sizeof(pp));

	pp.BackBufferHeight = 500;
	pp.BackBufferWidth = 500;
	pp.BackBufferFormat = D3DFMT_X8R8G8B8;
	pp.hDeviceWindow = hWnd;
	pp.Windowed = true;
	pp.SwapEffect = D3DSWAPEFFECT_DISCARD;

	pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, &device);

}

void Application::MessagePump()
{
	/*while(true)
	{
		while(!PeekMessage(&msg, hWnd, 0, 0, PM_NOREMOVE))
		{
			Render();
		}
		if(GetMessage(&msg, 0, 0, 0))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}*/

	while(PeekMessage(&msg,0,0,0,PM_NOREMOVE))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
}

LRESULT CALLBACK Application::WndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
		return 0;
	case WM_PAINT:
		{
			PAINTSTRUCT ps;
			BeginPaint(hWnd, &ps);
			app.Render();
			EndPaint(hWnd, &ps);
			return 0;
		}
	default:
		return DefWindowProc(app.hWnd, msg, wparam, lparam);
	}
}

void Application::Del()
{
	if(pD3D)
	{
		pD3D->Release();
	}
	if(device)
	{
		device->Release();
	}
}

void Application::Render()
{
	device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 0.0f, 0);
	
	device->BeginScene();
	device->EndScene();

	device->Present(NULL, NULL, NULL, NULL);
}
DeFace вне форума Ответить с цитированием
Старый 11.10.2009, 13:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

дескриптор какого окна?
своего?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.10.2009, 13:06   #3
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию

да, своего)
DeFace вне форума Ответить с цитированием
Старый 11.10.2009, 13:09   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Application.hWnd
а это что?
иль окно не получается создать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.10.2009, 13:13   #5
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию

при создании окна не получается дескриптор. в итоге окна нет(
DeFace вне форума Ответить с цитированием
Старый 11.10.2009, 13:21   #6
Crusher
Пользователь
 
Регистрация: 13.12.2008
Сообщений: 27
По умолчанию

Код:
wc.hInstance = hInstance
Надо поставить.
Crusher вне форума Ответить с цитированием
Старый 11.10.2009, 13:32   #7
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию

Не, я же все обнулил
Код:
ZeroMemory(&wc, sizeof(wc));
И я пытался так писать, но компилятор ошибку выводит что hInstance не объявлен
DeFace вне форума Ответить с цитированием
Старый 11.10.2009, 13:49   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
HINSTANCE, HINSTANCE, LPSTR, int
из аргументов WinMain надо его брать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.10.2009, 14:11   #9
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию

а не покажите как это сделать на моем примере)
DeFace вне форума Ответить с цитированием
Старый 11.10.2009, 14:24   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.

	return 0;
}
вот у меня заготовка пустого приложения...
переменка там есть...похоже у вас заголовон WinMain не полный
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить дескриптор окна другого приложения и сделать его активным Delphi 7 AndersX Помощь студентам 4 18.10.2009 09:32
Вызов ShellExecute из модуля. Какой тогда дескриптор окна указывать? Вавел из ГМТУ Общие вопросы Delphi 12 27.08.2009 14:44
Получить Handle TEdit'a, зная дескриптор родительского окна Cold_Night Win Api 2 13.02.2009 16:47
как получить дескриптор приложения в C#? fiatik Общие вопросы .NET 1 08.11.2008 08:18