使用 WNDCLASSEX 创建窗口? [Cpp]

问题描述 投票:0回答:3

首先这是我的代码...实际上,它几乎是从我正在尝试学习的 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
  • 回电
  • 如何启动应用程序进行实际使用
  • 修复编译器的转换错误
c++ windows callback
3个回答
4
投票

您会发现不处理 _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。您的代码将编译(并希望运行)得很好。


0
投票

我会依次回答你的每一个要点:

  • _T 是一个宏,当定义 UNICODE 时,其计算结果为 L;当未定义 UNICODE 时,计算结果为 。您可以在字符串文字周围使用此宏,以便在定义 UNICODE 时使用宽文字(例如 L"foo"),而在未定义时使用“窄”文字(例如“foo”)。同样,当定义了 UNICODE 时,TCHAR 是 wchar_t 的 typedef,而当未定义 UNICODE 时,TCHAR 是 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() 的定义。只需

    LoadIcon(hInstance, IDI_APPLICATION)
    即可。


0
投票

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 2 -6 5 输出复制 2 输入复制 1

输出复制 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

© www.soinside.com 2019 - 2024. All rights reserved.