Vytváření aplikací založených na systému Win32 (C++)
Tento názorný postup ukazuje, jak vytvořit základní systémem Win32 aplikace, která zobrazuje "Hello, World!" v okně. Můžete použít kód, který vyvíjíte tohoto postupu jako vzorek k vytvoření dalších aplikacích na základě Win32.
Rozhraní API systému Win32 (označované také jako Windows API) je založen c rámec pro vytváření aplikací systému Windows. Další informace o rozhraní Win32 API viz Rozhraní API systému Windows.
Důležité
Aby jasněji vysvětlení konkrétní segmenty kódu kroky v tomto dokumentu, možná jsme vynechat některé příkazy kódu, které jsou jinak potřebné pro pracovní použití; patří například směrnic a globální deklarace proměnných. Příklad na konci tohoto dokumentu zobrazuje kompletní kód.
Požadavky
Chcete-li dokončit tento návod, je třeba porozumět základům jazyka C++. Pokud spouštíte právě naučit C++, doporučujeme "Začátečník C++ Guide" podle Schildt Jahoda, která je k dispozici v Začátečník vývojář výukové centrum na webu MSDN.
Video ukázku naleznete v tématu Video postupy: Vytváření aplikací Win32 (C++) v dokumentaci pro Visual Studio 2008.
Vytvoření projektu aplikace Win32
V nabídce Soubor klikněte na příkaz Nový a potom klikněte na příkaz Projekt.
V Nový projekt dialogové okno v levém podokně klepněte na Nainstalované šablony, klepněte na tlačítko **Visual C++**a pak vyberte Win32. V prostředním podokně vyberte Projekt Win32.
V název zadejte název projektu, například win32app. Klikněte na tlačítko OK.
Na úvodní stránce Průvodce aplikace Win32, klepněte na tlačítko Další.
Na stránce nastavení aplikace pod Typ aplikace, vyberte aplikace systému Windows. Pod Další možnosti, vyberte Prázdný projekt. Pro vytvoření projektu klikněte na Dokončit.
V Aplikaci Solution Explorer, Win32app projektu klepněte pravým tlačítkem myši, klepněte na tlačítko Přidata klepněte na tlačítko Nové položky. V dialogovém okně Přidat novou položku vyberte Soubor C++ (.CPP). V název zadejte název souboru, například GT_HelloWorldWin32.cpp. Klepněte na tlačítko Přidat.
Spusťte aplikaci typu Win32
Stejně jako každý c a C++ použitím musí mít main musí mít funkce jako výchozí bod, každé aplikace pro systém Win32 WinMain funkce. WinMainmá následující syntaxi.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
Informace o parametrech a vrácené hodnoty funkce tohoto Funkce WinMain.
Protože kód aplikace musí používat existující definice, přidat příkazy souboru zahrnout.
#include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h>
Kromě WinMain funkce, musí mít také každou aplikaci se Win32 funkci procedury okna. Tato funkce je obvykle pojmenován WndProc. WndProcmá následující syntaxi.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Tato funkce zpracuje dalších zprávy přijímající aplikace z operačního systému. Například v aplikaci, která má dialogové okno má OK tlačítka, když uživatel klepne na tlačítko operační systém odešle aplikace zpráva, že jste klepli na tlačítko. WndProcje zodpovědný za reagovat na tuto událost. V příkladu může být vhodné odpovědi zavřete dialogové okno.
Další informace naleznete v tématu Procedury okna.
K přidání funkcí do funkce WinMain
V WinMain fungovat, vytvoření struktury třídy okna typu WNDCLASSEX. Tato struktura obsahuje informace o okně například ikonu aplikace, barva pozadí okna název, který chcete zobrazit v záhlaví název funkce okno postupu atd. Následující příklad ukazuje typickou WNDCLASSEX struktury.
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, 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));
Informace o polích této struktury WNDCLASSEX.
Nyní, když jste vytvořili třídu okna, je nutné zaregistrovat. Použití RegisterClassEx funkce a struktura třídy okna předat jako argument.
if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL); return 1; }
Nyní můžete vytvořit okno. Použití CreateWindow funkce.
static TCHAR szWindowClass[] = _T("win32app"); static TCHAR szTitle[] = _T("Win32 Guided Tour Application"); // 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 does 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; }
Tato funkce vrací HWND, což je popisovač okna. Další informace naleznete v tématu Datové typy Windows.
Zobrazí se okno nyní, použijte následující kód.
// The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
V tomto okamžiku zobrazeného okna nebude mít mnohem obsah protože ještě nebyla implementována WndProc funkce.
Přidáte smyčky zpráv přijímat zprávy, které odešle operačního systému. Když aplikace obdrží zprávu, odešle tato smyčka jej WndProc funkce zpracování. Smyčka zpráv se podobá následující kód.
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam;
Další informace týkající se struktur a funkcí ve smyčce zpráv naleznete MSG, GetMessage, TranslateMessage, a DispatchMessage.
V tomto okamžiku WinMain by měl vypadat funkce následující kód.
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, 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; }
K přidání funkcí do funkce WndProc
Povolení WndProc funkce pro zpracování zpráv, které obdrží, provedení příkazu switch.
Je první zprávu zpracovat WM_PAINT zprávy. Aplikace obdrží zprávu při části zobrazeného okna musí být aktualizovány. (Při prvním zobrazení okna všech je nutné aktualizovat.)
Zpracování WM_PAINT zprávy, první volání BeginPaint, pak zpracovat logiku rozvrhnout text, tlačítka a další ovládací prvky v okně a potom volat EndPaint. Pro tuto aplikaci je logika mezi volání zahájení a ukončení volání zobrazí řetězec "Hello, World!" v okně. Následující kód, který si TextOut funkce se používá k zobrazení řetězce.
PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, World!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, World!" // in the top left corner. TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); // End application-specific layout section. EndPaint(hWnd, &ps); break; }
Aplikace obvykle zpracovává mnoho dalších zpráv, například WM_CREATE a WM_DESTROY. Následující kód ukazuje základní ale dokončení WndProc funkce.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, World!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, World!" // in the top left corner. TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); // End application specific layout section. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0; }
Příklad
Tento příklad sestavení
Vytvoření projektu aplikace Win32 podle "K vytvoření projektu aplikace Win32" v tomto návodu.
Takto kód zkopírujte a vložte jej ve zdrojovém souboru GT_HelloWorldWin32.cpp.
V nabídce Build (Sestavit) klepněte na příkaz Build Solution (Sestavit řešení).
Chcete-li aplikaci spustit, stiskněte klávesu F5. Okno obsahující text "Hello World!" Zobrazí se v levém horním rohu zobrazení.
Kód
// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
#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, 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 does 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;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("Hello, World!");
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Here your application is laid out.
// For this introduction, we just print out "Hello, World!"
// in the top left corner.
TextOut(hdc,
5, 5,
greeting, _tcslen(greeting));
// End application-specific layout section.
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
Další kroky
Předchozí téma: Vytváření aplikací pro systém Windows (C++) | Další téma: Vytvoření Formulářová aplikace Windows pomocí technologie .NET Framework (C++)
Viz také
Úkoly
Vytváření aplikací pro systém Windows (C++)
Historie změn
Datum |
Poslední dokumenty |
Důvod |
---|---|---|
Prosinec 2010 |
Uvedeno, že jsme pravděpodobně jste vynechali některá požadováno jinak kódu příkazy tak, aby jasněji vysvětlení jiných částí kódu. |
Názory zákazníků |