c ++ - Opret vindue med WNDCLASSEX? [[Cpp]]

Indlæg af Hanne Mølgaard Plasc

Problem



Først her er min kode ... ja det er stort set kopieret og indsat fra Microsoft-tutorial, som jeg forsøger at lære af ...


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;
}


Fejl:


C:Users***DocumentsCodeBlocksProjectsencryptTextCreateWindow.cpp||In function 'int WinMain(HINSTANCE\_\_*, HINSTANCE\_\_*, CHAR*, int)':|
C:Users***DocumentsCodeBlocksProjectsencryptTextCreateWindow.cpp|32|error: cast from 'CHAR*' to 'WORD' loses precision|
C:Users***DocumentsCodeBlocksProjectsencryptTextCreateWindow.cpp|32|error: invalid static\_cast from type 'CHAR*' to type 'WORD'|
C:Users***DocumentsCodeBlocksProjectsencryptTextCreateWindow.cpp|37|error: cast from 'CHAR*' to 'WORD' loses precision|
||=== Build finished: 3 errors, 0 warnings ===|


Jeg troede, at jeg ville have brug for en static\_cast, men intet fungerede. Jeg prøvede endda at bruge WORD, men stadig gå fejlen. Så jeg har ingen idé om, hvad der skal gøres der.


Også hvordan bruger jeg endda dette? Jeg læste hele tutorialet et par gange.


Tutorial: http://msdn.microsoft.com/en-us/library/bb384843.aspx[8]


Jeg troede, du ville gøre noget lignende


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


Jeg kom virkelig ikke overalt med det.


Gør mig ikke forkert, selvom jeg forstår meget af det, men de ting, jeg ikke forstår syg, gå videre og list nedenfor.



  • \_T/TCHAR

  • tilbagekald

  • Sådan starter du programmet til faktisk brug

  • Fix compiler fejl til støbning


Bedste reference


Du finder det yderst hjælpsomt at ikke beskæftige sig med \_T, TCHAR og tchar.h. Det er relikvier fra de dage, hvor det var tænkeligt, du kan muligvis have din kode køre på Windows 95/98 og NT på samme tid. Jeg antager, at dette ikke er et problem for dig. Bare lav alt UNICODE - du vil ikke fortryde det. Det betyder, at alle streng-bogstaver bliver nødt til at blive præfikset med en 'L'. F.eks.


L"Win32 Guided Tour"


Gør nu dette:


Tilføj følgende to linjer til toppen af ​​din kildefil (før alle de indeholder)


#ifndef UNICODE
#define UNICODE
#endif

#ifndef \_UNICODE
#define \_UNICODE
#endif


(Eller bedre endnu, bare sørg for at UNICODE og \_UNICODE er angivet i dine projektindstillinger. Dette er standard i Visual Studio - så hvis du kører VS2008 eller VS2010, så spring bare over alt dette).


Tag nu static\_cast ud i dine LoadIcon-opkald. Din kode vil kompilere (og forhåbentlig køre) helt fint.

Andre referencer 1


Jeg svarer bare på hvert af dine kugler:



  • \_T er en makro, der evaluerer til L < macro\_argument > når UNICODE er defineret og bare < macro\_argument > når det ikke er defineret. Du vil bruge denne makro omkring string-bogstaver, så når UNICODE er defineret, bruges en bred bogstavlig (fx L 'foo'), og når den ikke er defineret, anvendes en 'smal' bogstavlig (fx 'foo'). På samme måde er TCHAR en typedef til wchar\_t når UNICODE er defineret og en typedef til char, når den ikke er defineret. Se denne artikel for mere information om globalisering af Windows-programmer. [9]

  • CALLBACK er en definering der evaluerer til \_\_stdcall. Dette er en Microsoft-specifik udvidelse, der ændrer funktionen fra standard cdecl calling convention til stdcall. Se denne artikel for at få flere oplysninger om at kalde konventioner. [10]

  • WinMain er startpunktet for Windows-programmer uden konsol. Teknisk definerer C-kørselstiden (CRT) det egentlige indgangspunkt, der kaldes af operativsystemet, og dette kalder i sin tur din WinMain. Ligesom main (), skal det aldrig kaldes direkte i din kode.

  • LoadIcon tager en LPCTSTR (wchar\_t const * eller en char const * afhængig af UNICODE) til den anden parameter. Makro MAKEINTRESOURCE vil udføre den relevante cast til LPTSTR, så du bør ikke caste den til et ord. Faktisk bør du ikke bruge MAKEINTRESOURCE-makroen her, da IDI\_APPLICATION allerede skal være en definering til MAKEINTRESOURCE (< some\_integer >) . Bare LoadIcon(hInstance, IDI\_APPLICATION) vil gøre.