首先这是我的代码...实际上,它几乎是从我正在尝试学习的 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
创建窗口.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 和 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
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(
LoadIcon(hInstance, IDI_APPLICATION)
即可。Pak Chanek 的孩子 Chaneka 是一个有野心的孩子,所以 Pak Chanek 给了她以下问题来测试她的野心。
给定一个整数数组 [A1,A2,A3,…,AN] 。在一次操作中,Chaneka可以选择一个元素,然后将该元素的值增加或减少1 。 Chaneka 可以多次执行该操作,即使对于不同的元素也是如此。
最少需要进行多少次运算才能使得 A1×A2×A3×…×AN=0 ?
输入 第一行包含一个整数 N (1≤N≤105 ).
第二行包含N 整数 A1,A2,A3,…,AN (−105≤Ai≤105 ).
输出 一个整数,表示使 A1×A2×A3×…×AN=0 必须完成的最小运算次数 .
输出复制 3 输入复制 5 0 -1 0 1 0 输出复制 0 笔记 在第一个例子中,最初,A1×A2×A3=2×(−6)×5=−60 。 Chaneka 可以执行以下操作序列:
减小A1的值 1 。那么,A1×A2×A3=1×(−6)×5=−30 减小A1的值 1 。那么,A1×A2×A3=0×(−6)×5=0 在第三个例子中,Chaneka不需要做任何操作,因为从一开始,它就已经成立了A1×A2×A3×A4×A5=0×(−1)×0×1×0=0