用WNDCLASSEX创build窗口?

首先这里是我的代码…其实它是从Microsoft教程非常复制和粘贴,我想学习…

CreateWindow.h

#ifndef CreateWindow_H #define CreateWindow_H #include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h> using namespace std; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); #endif 

CreateWindow.cpp

 #include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h> // Global variables // The main window class name. static TCHAR szWindowClass[] = _T("win32app"); // The string that appears in the application's title bar. static TCHAR szTitle[] = _T("Win32 Guided Tour Application"); HINSTANCE hInst; // Forward declarations of functions included in this code module: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, static_cast<WORD>(MAKEINTRESOURCE(IDI_APPLICATION))); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL); return 1; } hInst = hInstance; // Store instance handle in our global variable // The parameters to CreateWindow explained: // szWindowClass: the name of the application // szTitle: the text that appears in the title bar // WS_OVERLAPPEDWINDOW: the type of window to create // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) // 500, 100: initial size (width, length) // NULL: the parent of this window // NULL: this application dows not have a menu bar // hInstance: the first parameter from WinMain // NULL: not used in this application HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL); return 1; } // The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // Main message loop: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } 

错误:

 C:\Users\***\Documents\CodeBlocksProjects\encryptText\CreateWindow.cpp||In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':| C:\Users\***\Documents\CodeBlocksProjects\encryptText\CreateWindow.cpp|32|error: cast from 'CHAR*' to 'WORD' loses precision| C:\Users\***\Documents\CodeBlocksProjects\encryptText\CreateWindow.cpp|32|error: invalid static_cast from type 'CHAR*' to type 'WORD'| C:\Users\***\Documents\CodeBlocksProjects\encryptText\CreateWindow.cpp|37|error: cast from 'CHAR*' to 'WORD' loses precision| ||=== Build finished: 3 errors, 0 warnings ===| 

我以为我需要做一个static_cast,但没有任何工作。 我甚至尝试使用WORD,但仍然错误。 所以我不知道该怎么做。

我怎么用这个呢? 我几次阅读整个教程。

教程: http : //msdn.microsoft.com/en-us/library/bb384843.aspx

我以为你会做类似的事情

 // start up the four variables before hand, how ever that is done WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); 

我真的没有得到任何的地方。

不要误解我的意思,但是我了解了很多,但是我不明白的事情,请继续往下看。

  • _T / TCHAR
  • 回电话
  • 如何启动申请实际使用
  • 修复铸造的编译器错误

Solutions Collecting From Web of "用WNDCLASSEX创build窗口?"

你会发现不处理_T,TCHAR和tchar.h非常有帮助。 那些是可想而知的日子,你可能需要同时在Windows 95/98和NT上运行你的代码。 我假设这不是你的问题。 只要把一切UNICODE – 你不会后悔的。 这确实意味着所有字符串文字都需要以“L”作为前缀。 例如

 L"Win32 Guided Tour" 

现在做这个:

将以下两行添加到源文件的最顶部(在所有包含之前)

 #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif 

(或者更好,只要确保UNICODE和_UNICODE在你的项目设置中被设置,这是Visual Studio的默认设置,所以如果你正在运行VS2008或者VS2010,那么就跳过这一切)。

现在,在LoadIcon调用中取出static_cast。 你的代码将被编译(并希望运行)就好了。

我会依次回答你的每一个项目符号:

  • _T是一个宏,当UNICODE被定义时,它的值为L <macro_argument>,当它没有被定义时,它就是<macro_argument>。 你可以在字符串周围使用这个宏,这样当UNICODE被定义时,就会使用一个宽的字面量(例如L“foo”),而当它没有被定义时,会使用一个“窄”的字面量(例如“foo”)。 同样,当UNICODE被定义时,TCHAR是wchar_t的typedef,当它没有被定义时,是一个char的typedef。 有关Windows应用程序全球化的更多信息,请参阅本文 。

  • CALLBACK是一个定义,评估为__stdcall。 这是一个特定于Microsoft的扩展,它将函数从默认的cdecl调用约定修改为stdcall。 有关调用约定的更多信息,请参阅这篇文章 。

  • WinMain是非控制台Windows应用程序的入口点。 从技术上讲,C运行时(CRT)定义了操作系统调用的实际入口点,并依次调用您的WinMain。 像main(),它不应该直接在你的代码中调用。

  • LoadIcon为第二个参数使用LPCTSTR(wchar_t const *或char const *,取决于UNICODE)。 MAKEINTRESOURCE宏将适当的转换为LPTSTR,所以你不应该把它转换成WORD。 实际上,您不应该在这里使用MAKEINTRESOURCE宏,因为IDI_APPLICATION应该已经是MAKEINTRESOURCE(<some_integer>)的一个定义 。 只需LoadIcon(hInstance, IDI_APPLICATION)就可以了。