İzlenecek yol: Geleneksel bir Windows Masaüstü uygulaması oluşturma (C++)
Bu kılavuz, Visual Studio'da geleneksel bir Windows masaüstü uygulamasının nasıl oluşturulacağını gösterir. Oluşturduğunuz uygulama, bir pencerede "Hello, Windows masaüstü!" görüntülemek için Windows API'sini kullanır. Windows masaüstü uygulamaları oluşturmak için bu kılavuzda geliştirdiğiniz kodu bir desen olarak kullanabilirsiniz.
Windows API'si (Win32 API, Windows Masaüstü API'si ve Windows Klasik API olarak da bilinir), Windows uygulamaları oluşturmaya yönelik C dili tabanlı bir çerçevedir. Onlarca yıldır Windows uygulamaları oluşturmak için kullanılmıştır. Windows API'sinin üzerinde daha gelişmiş ve daha kolay programlı çerçeveler oluşturulmuş. Örneğin, MFC, ATL, .NET çerçeveleri. C++/WinRT dilinde yazılmış UWP ve Mağaza uygulamaları için en modern Windows Çalışma Zamanı kodu bile altındaki Windows API'sini kullanır. Windows API hakkında daha fazla bilgi için bkz . Windows API Dizini.
Önemli
Bu belgenin sonundaki Kodu derle bölümünde kodun tamamı gösterilir. Bu izlenecek yol, bir Windows uygulamasına giden çeşitli kod parçalarını kapsar, ancak kod parçacıklarında en önemli parçalara odaklanmak için bazı ayrıntılar atlandığından, yazarken kodlamazsınız. Kodun tamamını kopyalayıp sonunda projenize yapıştırabilirsiniz.
Önkoşullar
Microsoft Windows 7 veya sonraki sürümleri çalıştıran bir bilgisayar. En iyi geliştirme deneyimi için Windows 11 veya üzerini öneririz.
Visual Studio'nun bir kopyası. Visual Studio'yu indirme ve yükleme hakkında bilgi için bkz . Visual Studio'yu Yükleme. Yükleyiciyi çalıştırdığınızda, C++ iş yüküyle Masaüstü geliştirmenin denetlendiğinden emin olun. Visual Studio'yu yüklerken bu iş yükünü yüklemediyseniz endişelenmeyin. Yükleyiciyi yeniden çalıştırabilir ve şimdi yükleyebilirsiniz.
Visual Studio IDE'yi kullanmaya ilişkin temel bilgiler. Windows masaüstü uygulamalarını daha önce kullandıysanız, büyük olasılıkla devam edebilirsiniz. Giriş için bkz . Visual Studio IDE özellik turu.
C++ dilinin temelleri hakkında yeterli bilgi. Merak etme, çok karmaşık bir şey yapmayız.
Windows masaüstü projesi oluşturma
İlk Windows masaüstü projenizi oluşturmak için bu adımları izleyin. Bu kılavuzun başındaki nota göre, tamamlanmış kod, kılavuzun sonundaki Kod derleme bölümünde bulunur. Devam edin ve projeyi oluşturma adımlarını izleyin, ancak uygulama kodunun tamamı sunulduğunda kodun aşağıdaki bölümlerini sonuna kadar yapıştırmayı bekleyin. En önemli parçalara odaklanmak için kod parçacıklarında bazı ayrıntılar atlanır. Kodun tamamını kopyalayıp sonunda projenize yapıştırabilirsiniz.
Açıklamayı basitleştirmek için. Tercih ettiğiniz Visual Studio sürümünün belgelerini görmek için Sürüm seçici denetimini kullanın. Bu sayfadaki içindekiler tablosunun en üstünde bulunur.
Visual Studio'da Windows masaüstü projesi oluşturmak için
Ana menüden Dosya>Yeni Proje'yi seçerek Yeni>Proje Oluştur iletişim kutusunu açın.
İletişim kutusunun üst kısmında Dil'i C++ olarak, Platform'ı Windows olarak ve Proje türünü Masaüstü olarak ayarlayın.
Filtrelenen proje türleri listesinden Windows Masaüstü Sihirbazı'nı ve ardından İleri'yi seçin. Sonraki sayfada, proje için desktopapp gibi bir ad girin.
Projeyi oluşturmak için Oluştur düğmesini seçin.
Artık Windows Masaüstü Projesi iletişim kutusu görüntülenir. Uygulama türü açılan listesinde Masaüstü uygulaması (.exe) öğesini seçtiğinizden emin olun. Bir Windows uygulaması yaptığımız için Konsol Uygulaması'nın seçilmesi, kullanacağımız koda göre derlenmeyecek bir projeyle sonuçlaşır. Ardından, Ek seçenekler'in altında Projeyi boşalt'ı seçin. Projeyi oluşturmak için Tamam'ı seçin.
Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.
Animasyonda, Çözüm Gezgini proje adına sağ tıklanması, görüntülenen menüden Ekle'nin seçilmesi ve ardından Yeni Öğe'nin seçilmesi gösterilir.
Yeni Öğe Ekle iletişim kutusunda C++ Dosyası (.cpp) öğesini seçin. Ad kutusuna dosya için bir ad yazın( örneğin, HelloWindowsDesktop.cpp). Ekle'yi seçin.
Projeniz oluşturulur ve kaynak dosyanız düzenleyicide açılır.
Visual Studio 2017'de Windows masaüstü projesi oluşturmak için
Dosya menüsünde Yeni'yi ve ardından Proje'yi seçin.
Yeni Proje iletişim kutusunda, sol bölmede Yüklü>Visual C++ öğesini genişletin, ardından Windows Masaüstü'nü seçin. Orta bölmede Windows Masaüstü Sihirbazı'nı seçin.
Ad kutusuna proje için desktopapp gibi bir ad yazın. Tamam'ı seçin.
Windows Masaüstü Projesi iletişim kutusundaki Uygulama türü altında Windows uygulaması (.exe) öğesini seçin. Ek seçenekler'in altında Projeyi boşalt'ı seçin. Önceden Derlenmiş Üst Bilgi'nin seçili olmadığından emin olun. Projeyi oluşturmak için Tamam'ı seçin.
Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.
Animasyonda, Çözüm Gezgini proje adına sağ tıklanması, görüntülenen menüden Ekle'nin seçilmesi ve ardından Yeni Öğe'nin seçilmesi gösterilir.
Yeni Öğe Ekle iletişim kutusunda C++ Dosyası (.cpp) öğesini seçin. Ad kutusuna dosya için bir ad yazın( örneğin, HelloWindowsDesktop.cpp). Ekle'yi seçin.
Projeniz oluşturulur ve kaynak dosyanız düzenleyicide açılır.
Visual Studio 2015'te Windows masaüstü projesi oluşturmak için
Dosya menüsünde Yeni'yi ve ardından Proje'yi seçin.
Yeni Proje iletişim kutusundaki sol bölmede Yüklü>Şablonlar>Visual C++ öğesini genişletin ve Win32'yi seçin. Orta bölmede Win32 Projesi'ni seçin.
Ad kutusuna proje için desktopapp gibi bir ad yazın. Tamam'ı seçin.
Win32 Uygulama Sihirbazı'nın Genel Bakış sayfasında İleri'yi seçin.
Uygulama Ayarları sayfasında, Uygulama türü'nin altında Windows uygulaması'nı seçin. Ek seçenekler'in altında, Önceden derlenmiş üst bilgi'nin işaretini kaldırın ve ardından Projeyi boşalt'ı seçin. Projeyi oluşturmak için Son'u seçin.
Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.
Animasyonda, Çözüm Gezgini proje adına sağ tıklanması, görüntülenen menüden Ekle'nin seçilmesi ve ardından Yeni Öğe'nin seçilmesi gösterilir.
Yeni Öğe Ekle iletişim kutusunda C++ Dosyası (.cpp) öğesini seçin. Ad kutusuna dosya için bir ad yazın( örneğin, HelloWindowsDesktop.cpp). Ekle'yi seçin.
Projeniz oluşturulur ve kaynak dosyanız düzenleyicide açılır.
Kod
Ardından, Visual Studio'da bir Windows masaüstü uygulaması için kod oluşturmayı öğrenin.
Windows masaüstü uygulamasında kodun çalışmaya başladığı yer
Her C uygulamasının ve C++ uygulamasının başlangıç noktası olarak bir
main
işlevi olması gerektiği gibi, her Windows masaüstü uygulamasının da birWinMain
işlevi olmalıdır.WinMain
aşağıdaki söz dizimine sahiptir.int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow );
Bu işlevin parametreleri ve dönüş değeri hakkında bilgi için bkz . WinMain giriş noktası.
Not
Tüm bu ek sözcükler nelerdir, örneğin, veya
CALLBACK
, ya daHINSTANCE
_In_
?WINAPI
Geleneksel Windows API'sinde tür tanımları ve önişlemci makroları, çağırma kuralları,__declspec
bildirimler ve derleyici pragmaları gibi tür ve platforma özgü kod ayrıntılarını soyutlama amacıyla kapsamlı olarak kullanılır. Visual Studio'da, bu tür tanımlarının ve makroların ne tanımladığına bakmak için IntelliSense Hızlı Bilgi özelliğini kullanabilirsiniz. Farenizi ilgilendiğiniz sözcüğün üzerine getirin veya seçin ve tanımı içeren küçük bir açılır pencere için Ctrl+K, Ctrl+I tuşlarına basın. Daha fazla bilgi için bkz . IntelliSense kullanma. Parametreler ve dönüş türleri genellikle programlama hatalarını yakalamanıza yardımcı olmak için SAL Ek Açıklamaları kullanır. Daha fazla bilgi için bkz . C/C++ Kod Hatalarını Azaltmak için SAL Ek Açıklamalarını Kullanma.Windows masaüstü programları gerektirir
<windows.h>
. ayrıca sık sık görürsünüz#include <tchar.h>
. Bu, veyawchar_t
ilechar
çalışabilecek bir uygulama yazmayı kolaylaştırmaktır. Bunun yerine kodunuzdaki makroyuTCHAR
kullanmanızdır. Bu, simge projenizde tanımlanıyorsa sonuç olarakwchar_t
çözümleniyor,UNICODE
aksi takdirde olarak çözümleniyorchar
. Her zaman UNICODE etkin olarak derlediyseniz, gerekmezTCHAR
ve doğrudan kullanabilirsinizwchar_t
. Daha fazla bilgi için bkz . Genel metin eşlemelerini kullanma. Aşağıdaki kod, dosyanın en üstünde bu iki#include
deyimi gösterir.#include <windows.h> #include <tchar.h>
İşlevle birlikte, her Windows masaüstü uygulamasının
WinMain
da bir pencere yordamı işlevi olmalıdır. Bu işlev olarakWndProc
adlandırılır, ancak kodunuzda istediğiniz adı verebilirsiniz.WndProc
aşağıdaki söz dizimine sahiptir.LRESULT CALLBACK WndProc( _In_ HWND hWnd, _In_ UINT message, _In_ WPARAM wParam, _In_ LPARAM lParam );
Bu işlevde, olaylar gerçekleştiğinde uygulamanın Windows'tan aldığı iletileri işlemek için kod yazarsınız. Örneğin, bir kullanıcı uygulamanızda tamam düğmesini seçerse Windows size bir ileti gönderir. Uygun olan her işi yerine getiren bir
WndProc
işlevin içine kod yazarsınız. Buna olay işleme denir. Yalnızca uygulamanızla ilgili olayları işlersiniz.Daha fazla bilgi için bkz . Pencere Yordamları.
İşleve WinMain
işlevsellik ekleme
işlevinde
WinMain
, ana pencerenizle ilgili bazı temel bilgileri yakalamanız gerekir. Bunu, türündeWNDCLASSEX
bir yapı doldurarak yaparsınız. Yapı, pencere hakkında uygulama simgesi, pencerenin arka plan rengi, başlık çubuğunda görüntülenecek ad gibi bilgileri içerir. Önemli olan, Windows'un uygulamanıza gönderdiği iletileri işleyen pencere yordamınıza yönelik bir işlev işaretçisi içerir. Aşağıdaki örnekte tipikWNDCLASSEX
bir yapı gösterilmektedir: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(wcex.hInstance, 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, IDI_APPLICATION);
Yukarıdaki yapının alanları hakkında bilgi için bkz
WNDCLASSEX
. .WNDCLASSEX
Yapıyı doldurduktan sonra, pencerenizi ve ona nasıl ileti gönderildiğini bilmesi için Windows'a kaydedersiniz.RegisterClassEx
işlevini kullanın ve pencere sınıfı yapısını bağımsız değişken olarak geçirin. Yukarıdaki_T
Unicode hakkındaki tartışma başına türü kullandığımızTCHAR
için makro kullanılır. Aşağıdaki kod, pencere sınıfının nasıl kaydedileceklerini gösterir.if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Windows Desktop Guided Tour"), NULL); return 1; }
Ardından işlevini kullanarak
CreateWindowEx
bir pencere oluşturursunuz.static TCHAR szWindowClass[] = _T("DesktopApp"); static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application"); // The parameters to CreateWindowEx explained: // WS_EX_OVERLAPPEDWINDOW : An optional extended window style. // 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 = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindowEx failed!"), _T("Windows Desktop Guided Tour"), NULL); return 1; }
Bu işlev bir
HWND
pencere tutamacı olan bir döndürür. Tanıtıcı bir tür işaretçi gibidir. Windows, oluşturduğunuz pencereleri izlemek için bunu kullanır. Daha fazla bilgi için bkz . Windows Veri Türleri.Bu noktada pencere oluşturulmuştur, ancak yine de Windows'a bunu görünür hale getirmesini söylememiz gerekir. Bu kodun yaptığı budur:
// The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
İşlevi henüz uygulamadığınız için görüntülenen pencere yalnızca boş bir dikdörtgendir
WndProc
. Uygulama henüz Windows'un gönderdiği iletileri işlemez.İletileri işlemek için öncelikle Windows'un gönderdiği iletileri dinlemek için ileti döngüsü olarak adlandırılan bir döngü ekleriz. Uygulama bir ileti aldığında, bu döngü işlenmek üzere bu iletiyi işlevinize
WndProc
iletir. İleti döngüsü aşağıdaki koda benzer:MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam;
İleti döngüsündeki yapılar ve işlevler hakkında daha fazla bilgi için bkz
MSG
. ,GetMessage
, TranslateMessage veDispatchMessage
.Uygulamanın ana penceresini oluşturan ve Windows'un uygulamanızı gönderdiği iletileri dinleyen temel
WinMain
bir işlev aşağıdaki koda benzer: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(wcex.hInstance, 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, IDI_APPLICATION); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Windows Desktop Guided Tour"), NULL); return 1; } // Store instance handle in our global variable hInst = hInstance; // The parameters to CreateWindowEx explained: // WS_EX_OVERLAPPEDWINDOW : An optional extended window style. // 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 = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Windows Desktop 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; }
İşlevdeki iletileri işleme WndProc
Uygulamanın aldığı iletileri işlemek için işlevinizde
WndProc
birswitch
deyim uygularsınız.İşlenmek için önemli bir ileti:
WM_PAINT
. Uygulama, görüntülenen penceresinin bir bölümünün güncelleştirilmiş olması gerektiğinde birWM_PAINT
ileti alır. Olay, kullanıcı pencerenizin önündeki bir pencereyi taşır ve yeniden uzağa taşırsa oluşabilir. Pencereniz ilk kez görüntülendiğinde bu iletiyi alır ve uygulama kullanıcı arabiriminizi görüntüleme fırsatı verir. Uygulamanız bu olayları Windows gönderdiğinde öğrenir. Pencere ilk kez görüntülendiğinde, tümünün güncelleştirilmiş olması gerekir.İletiyi
WM_PAINT
işlemek için önce çağrısıBeginPaint
yapın, ardından metin, düğme ve diğer denetimleri pencereye yerleştirmeye ilişkin tüm mantığı işleyin. Ardından çağrısı yapınEndPaint
. Bu uygulama için ve arasındakiBeginPaint()
EndPaint()
kod içinde oluşturduğunuzWinMain()
pencerede görüntülenirHello, Windows desktop!
. Aşağıdaki koddaTextOut
işlev, metni pencerede belirtilen konumda görüntüler.PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, Windows desktop!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, Windows desktop!" // in the top left corner. TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); // End application-specific layout section. EndPaint(hWnd, &ps); break; }
Yukarıdaki kodda,
HDC
pencerenin istemci alanıyla ilişkili bir cihaz bağlamı tanıtıcısıdır. İstemci alanına başvurmak için pencerede çizim yaparken bunu kullanırsınız.BeginPaint
çizime hazırlanmak ve istemci alanındaki çizimi tamamlamak için veEndPaint
işlevlerini kullanın.BeginPaint
istemci alanında çizim için kullanılan görüntü cihazı bağlamının tutamacını döndürür;EndPaint
boya isteğini sonlandırır ve cihaz bağlamını serbest bırakır.Bir uygulama genellikle diğer birçok iletiyi işler. Örneğin,
WM_CREATE
bir pencere ilk oluşturulduğunda veWM_DESTROY
pencere kapatıldığında gönderilir. Aşağıdaki kod, temel ama eksiksizWndProc
bir işlevi gösterir:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, Windows desktop!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, Windows desktop!" // 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; }
Kodu oluşturma
Söz verilen şekilde, çalışan uygulamanın tam kodu aşağıdaki gibidir.
Bu örneği oluşturmak için
Düzenleyicideki HelloWindowsDesktop.cpp tüm kodu silin. Bu örnek kodu kopyalayın ve HelloWindowsDesktop.cpp yapıştırın:
// HelloWindowsDesktop.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("DesktopApp"); // The string that appears in the application's title bar. static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application"); // Stored instance handle for use in Win32 API calls such as FindResource HINSTANCE hInst; // Forward declarations of functions included in this code module: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ 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(wcex.hInstance, 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, IDI_APPLICATION); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Windows Desktop Guided Tour"), NULL); return 1; } // Store instance handle in our global variable hInst = hInstance; // The parameters to CreateWindowEx explained: // WS_EX_OVERLAPPEDWINDOW : An optional extended window style. // 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 = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Windows Desktop 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, Windows desktop!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, Windows desktop!" // 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; }
Derle menüsünde Çözüm Derle'yi seçin. Derlemenin sonuçları Visual Studio'daki Çıkış penceresinde görünür.
Animasyonda tümünü kaydet düğmesine tıkladıktan sonra ana menüden Derleme > Derleme Çözümü'ne tıklanması gösterilir.
Uygulamayı çalıştırmak için F5 tuşuna basın. "Merhaba, Windows masaüstü!" metnini içeren bir pencere görünmelidir.
Tebrikler! Geleneksel bir Windows masaüstü uygulaması oluşturdunuz.