Создать окно с WNDCLASSEX? [Срр] - PullRequest
0 голосов
/ 03 апреля 2011

Сначала вот мой код ... ну, на самом деле он в значительной степени скопирован и вставлен из учебника 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
  • CALLBACK
  • Как запустить приложение для фактического использования
  • Исправить ошибки компилятора для приведения

Ответы [ 2 ]

4 голосов
/ 03 апреля 2011

Вы найдете чрезвычайно полезным не иметь дело с _T, TCHAR и tchar.h. Это пережитки тех дней, когда это было возможно, возможно, вам пришлось запускать свой код в Windows 95/98 и NT одновременно. Я предполагаю, что это не проблема для вас. Просто сделайте все ЮНИКОД - вы не пожалеете об этом. Это означает, что все строковые литералы должны иметь префикс «L». Э.Г.

L"Win32 Guided Tour"

Теперь сделайте это:

Добавьте следующие две строки в самый верх вашего исходного файла (перед всеми включениями)

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

(или еще лучше, просто убедитесь, что UNICODE и _UNICODE установлены в настройках вашего проекта. Это значение по умолчанию в Visual Studio - поэтому, если вы используете VS2008 или VS2010, просто пропустите все это).

Теперь удалите static_cast из ваших вызовов LoadIcon. Ваш код скомпилируется (и, надеюсь, будет работать) просто отлично.

0 голосов
/ 03 апреля 2011

Я просто отвечу на каждую из ваших пуль по очереди:

  • _T - это макрос, который оценивается как Lкогда UNICODE определен и простокогда это не определено.Вы должны использовать этот макрос вокруг строковых литералов, чтобы при определении UNICODE использовался широкий литерал (например, L "foo"), а когда он не определен, использовался "узкий" литерал (например, "foo").Аналогично, TCHAR - это typedef для wchar_t, когда UNICODE определен, и typedef для char, если он не определен.См. эту статью для получения дополнительной информации о глобализации приложений 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) подойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...