First here is my code... well actually it is pretty much copied and pasted from Microsoft tutorial that I am trying to learn from...
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;
}
Errors:
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 ===|
I thought that I would need to do a static_cast, but nothing was working. I even tried using WORD, but still go the error. So I have no idea what to do there.
Also how do I even use this? I read the entire tutorial a couple times.
Tutorial: http://msdn.microsoft.com/en-us/library/bb384843.aspx
I thought you would do something like
// start up the four variables before hand, how ever that is done
WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
I didn't really get anywhere with that.
Don't get me wrong though... I understand a lot of it, but the things I don't understand ill go ahead and list below.
- _T / TCHAR
- CALLBACK
- How to start up application for actual use
- Fix compiler errors for casting
I'll just answer each of your bullets in turn:
_T is a macro that evaluates to L<macro_argument> when UNICODE is defined and just <macro_argument> when it is not defined. You would use this macro around string literals so that when UNICODE is defined a wide literal is used (e.g. L"foo") and when it is not defined a "narrow" literal is used (e.g. "foo"). Likewise, TCHAR is a typedef to wchar_t when UNICODE is defined and a typedef to char when it is not defined. See this article on more information about globalization of Windows applications.
CALLBACK is a define that evaluates to __stdcall. This is a Microsoft-specific extension that modifies the function from the default cdecl calling convention to stdcall. See this article for more information about calling conventions.
WinMain is the entry point for non-console Windows applications. Technically, the C runtime (CRT) defines the actual entry point called by the operating system and this in turn calls your WinMain. Like main(), it should never be called directly in your code.
LoadIcon takes a LPCTSTR (wchar_t const* or a char const* depending on UNICODE) for the second parameter. The MAKEINTRESOURCE macro will do the appropriate cast to LPTSTR, so you should not be casting it to a WORD. In fact, you should not be using the MAKEINTRESOURCE macro here at all since IDI_APPLICATION should already be a define to MAKEINTRESOURCE(<some_integer>). Simply
LoadIcon(hInstance, IDI_APPLICATION)
will do.You'll find it extremely helpful to not deal with _T, TCHAR, and tchar.h. Those are relics from the days when it was conceivable you might have to have your code run on Windows 95/98 and NT at the same time. I'm assuming this isn't an issue for you. Just make everything UNICODE - you won't regret it. This does mean that all string literals will need to get prefixed with an 'L'. E.g.
Now do this:
Add the following two lines to the very top of your source file (before all the includes)
(Or better yet, just make sure UNICODE and _UNICODE are set in your project settings. This is the default in Visual Studio - so if you're running VS2008 or VS2010, then just skip all this).
Now, take out the static_cast in your LoadIcon calls. Your code will compile (and hopefully run) just fine.