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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2008, 16:44   #1
Zaraki
 
Регистрация: 15.03.2008
Сообщений: 5
По умолчанию Помогите разобраться с кодом WINApi

написал как в одном уроке по создания окна, но коплиться нехочет, подскажите пожайлусиа

Код:
// main.cpp

#include <windows.h>

int Init(HWND hWndMain);
void ReleaseAll();
void OnIdle();
int Run();
HWND CreateMainWindow(LPCSTR pWindowName, int nWidth, int nHeight,
                      int nCmdShow=SW_NORMAL, bool bIsOpenGL=false);

namespace{
  HINSTANCE hInstance;
  HWND hWndMain;

  const char * szAppName = "Demo";
}

// WinMain
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
  hInstance = hInst;
  hWndMain = CreateMainWindow("My Demo",640,480);
  if(!hWndMain)
    return 0;
  if(!Init(hWndMain))
    return 0;
  int nRet = Run();
  ReleaseAll();
  return nRet;
}

int Init(HWND hWndMain)
{

  return 1;
}

void ReleaseAll()
{

}

void OnIdle()
{

}


LRESULT WINAPI MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch( msg )
  {
    case WM_LBUTTONDOWN:
      break;
    case WM_SIZE:
      break;
    case WM_DESTROY:
      PostQuitMessage( 0 );
      return 0;
  }
  return CallWindowProc( (WNDPROC)DefWindowProc, hWnd, msg, wParam, lParam );
}

HWND CreateMainWindow(LPCSTR pWindowName, int nWidth, int nHeight,
                      int nCmdShow, bool bIsOpenGL)
{
  WNDCLASS wndclass;
  wndclass.style         = 0;
  wndclass.lpfnWndProc   = (WNDPROC)MainWndProc;
  wndclass.cbClsExtra    = 0;
  wndclass.cbWndExtra    = 0;
  wndclass.hInstance     = hInstance;
  wndclass.hIcon         = LoadIcon (hInstance, szAppName);
  wndclass.hCursor       = LoadCursor (NULL,IDC_ARROW);
  wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  wndclass.lpszMenuName  = szAppName;
  wndclass.lpszClassName = szAppName;

  if(!RegisterClass(&wndclass))
    return 0;

  DWORD dwStyle = WS_OVERLAPPEDWINDOW;
  if(bIsOpenGL)
    dwStyle |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

  HWND hWnd = CreateWindow(szAppName, pWindowName, dwStyle,
                      (GetSystemMetrics(SM_CXSCREEN)-nWidth)/2,
                      (GetSystemMetrics(SM_CYSCREEN)-nHeight)/2,
                      nWidth, nHeight,
                      0, 0, hInstance, NULL);
  if(hWnd)
  {
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
  }
  return hWnd;
}

int Run()
{
  MSG msg={0};

  while(msg.message!=WM_QUIT)
  {
    if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
    {
      if(GetMessage(&msg, NULL, 0, 0))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
    }
    else
      OnIdle();
  }
  return msg.wParam;
}
пишет такие ошибки (лог):

Linking...
LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup
Debug/win32_main.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

win32_main.exe - 2 error(s), 1 warning(s)
Zaraki вне форума Ответить с цитированием
Старый 22.03.2008, 16:57   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Не знаю в чем ошибка у тебя. Вот мой вариант проги на WinApi. прога просто создает окно с серым фоном.

Код:

#include <windows.h>
//#include <d3d9.h>


LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch(msg)
	{
		case WM_PAINT: break;
		case WM_DESTROY:
			{
				PostQuitMessage(0);
				return 0;
			}
			break;
	}
		return (DefWindowProc(hwnd, msg, wparam, lparam));
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEXA windowsclass; //определение класса
	HWND hwnd;//дескриптор окна
	MSG msg;//идентификатор сообщения

	windowsclass.cbSize = sizeof(windowsclass);//размер класса
	windowsclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;//флаги стиля окна, если перемещен по вертикали - перерисовать окно, если перемещено по горизонтали - перерисовать окно, для каждого окна - свой контекст устройств, сообщение о двойном щелчке
	windowsclass.lpfnWndProc = MainWinProc;//укзатель на функцию обратного вызова, вызывается в цикле обработки событий
	windowsclass.cbClsExtra = 0;//дополнительная информация
	windowsclass.cbWndExtra = 0;//дополнительная информация
	windowsclass.hInstance = hInstance;//экземпляр создаваемого окна
	windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//иконка
	windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);//курсор
	windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//заливка фона окна
	windowsclass.lpszMenuName = NULL;//имя меню
	windowsclass.lpszClassName = "Windowsclass";//название класса
	windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);//иконка на панели задач

	RegisterClassExA(&windowsclass);
	
	hwnd = CreateWindowExA(NULL, "Windowsclass", "DirectX", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300, 150, 500, 400, NULL, NULL, hInstance, NULL);
	SetWindowTextA(hwnd, "Новый документ");

	ShowWindow(hwnd, SW_SHOWDEFAULT);
	UpdateWindow(hwnd);

	while(GetMessage(&msg, NULL, 0, 0))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	return(msg.wParam);
}
Может найдешь, в чем ошибка у тя. Этот код рабочий. Компилить в MSVS 2005.


ПыСы: у мя вопрос.У меня при создании проекта автоматически определяется тип функций, использующих текст в кодировке ЮНИКОД. В связи с чем в названии окна выводятся квадратики. Не подскажете, как отрубить UNICODE-кодировку и подключить ANSI-кодировку.
Я просто не хочу изменять системный h-файл.

Последний раз редактировалось MaTBeu; 22.03.2008 в 17:00. Причина: Возник вопрос
MaTBeu вне форума Ответить с цитированием
Старый 22.03.2008, 17:21   #3
Zaraki
 
Регистрация: 15.03.2008
Сообщений: 5
По умолчанию

таже ошибка, у меня Visual C++ Pro v6.0 - Portable, наверное проблема в нем
Zaraki вне форума Ответить с цитированием
Старый 22.03.2008, 17:27   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Я вообще этот код переводил из книги. Там написано как раз под твою среду. Книга называется "DirectX9. Уроки программирования на С++" Горнаков С.Г.

Но я бы тебе посоветовал поставить MSVS 2005. Тогда все будет арбайтен. Насчет где взять читай в верхних топах этого форума. Про книги там тоже есть.
Кстати, книгу качал отсюда
MaTBeu вне форума Ответить с цитированием
Старый 22.03.2008, 17:29   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Zaraki, проект какой? Консольный? Вот линкер main и ищет.
B_N вне форума Ответить с цитированием
Старый 22.03.2008, 18:43   #6
Zaraki
 
Регистрация: 15.03.2008
Сообщений: 5
По умолчанию

проект Win32 Aplication.

я неправельно наверное выразился, при компиляции пишет все ок, ненаходит ошибок. А когда делаю билд тут то и эта ошибка лезит.
Zaraki вне форума Ответить с цитированием
Старый 22.03.2008, 18:55   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Zaraki Посмотреть сообщение
проект Win32 Aplication.

я неправельно наверное выразился, при компиляции пишет все ок, ненаходит ошибок. А когда делаю билд тут то и эта ошибка лезит.
Я вижу, что при компиляции нет ошибок и то, что приложение Win32. Ошибки при сборке - линкер не может назначить точку входа, которая по умолчанию для консольных проектов - main, а для оконных - WinMain. Начните оконный проект, а не консольный.
B_N вне форума Ответить с цитированием
Старый 23.03.2008, 12:33   #8
Zaraki
 
Регистрация: 15.03.2008
Сообщений: 5
По умолчанию

to B_N Спасибо! огромное! Все работает!

тепреь подключил OpenGl и он опять ругаеться

unresolved external symbol __imp__wglMakeCurrent@8 referenced in function "int __cdecl InitOpenGL(struct HWND__ *)" (?InitOpenGL@@YAHPAUHWND__@@@Z)

тоже самое на __imp__wglCreateContext@4 и __imp__wglDeleteContext@4
Zaraki вне форума Ответить с цитированием
Старый 23.03.2008, 13:11   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Zaraki Посмотреть сообщение
тепреь подключил OpenGl и он опять ругаеться

unresolved external symbol __imp__wglMakeCurrent@8 referenced in function "int __cdecl InitOpenGL(struct HWND__ *)" (?InitOpenGL@@YAHPAUHWND__@@@Z)

тоже самое на __imp__wglCreateContext@4 и __imp__wglDeleteContext@4
Теперь линкеру просто нужна библиотека, в которой физически содержится вызываемая функция. В случае с OGL всё просто - это OpenGL32.Lib. Залезайте в настройки проекта, смотрите, где командная строка для линкера и добавляйте ему этот файл. В VS2003 это делается так: http://img401.imageshack.us/my.php?i...3360465ui8.jpg
B_N вне форума Ответить с цитированием
Старый 23.03.2008, 14:30   #10
Zaraki
 
Регистрация: 15.03.2008
Сообщений: 5
По умолчанию

Спасобо еще раз B_N, все ок !
Zaraki вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом! sid Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 13.04.2010 17:53
Помогите с кодом DM_bite Помощь студентам 12 02.08.2008 11:40
помогите разобраться с кодом samosval Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.12.2007 00:20
Просьба разобраться с кодом на С++ deazer Помощь студентам 1 08.11.2007 07:55
Помогите разобраться с кодом С++ Noor Помощь студентам 20 10.10.2007 17:42