Aracılığıyla paylaş


İ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 Yükleyicisi C++ iş yüküyle Masaüstü geliştirme işleminin ekran görüntüsü: Visual C++ araç takımının gücünü kullanarak klasik Windows tabanlı uygulamalar oluşturma

  • 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

  1. Ana menüden Dosya>Yeni Proje'yi seçerek Yeni>Proje Oluştur iletişim kutusunu açın.

  2. İletişim kutusunun üst kısmında Dil'i C++ olarak, Platform'ı Windows olarak ve Proje türünü Masaüstü olarak ayarlayın.

  3. 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.

  4. Projeyi oluşturmak için Oluştur düğmesini seçin.

  5. 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.

  6. Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.

    Visual Studio 2019'da DesktopApp Project'e yeni öğe eklemeyi gösteren animasyon.

    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.

  7. 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.

    Visual Studio 2019'da Yeni Öğe Ekle iletişim kutusunun ekran görüntüsü. C artı Dosya (.cpp) seçeneği belirlenir. Ad alanı Hello Windows Desktop.cpp olarak ayarlanır.

Projeniz oluşturulur ve kaynak dosyanız düzenleyicide açılır.

Visual Studio 2017'de Windows masaüstü projesi oluşturmak için

  1. Dosya menüsünde Yeni'yive ardından Proje'yi seçin.

  2. 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.

    Visual Studio 2017'de Yeni Proje iletişim kutusunun ekran görüntüsü. Windows Masaüstü Sihirbazı öğesi seçilidir. Ad metin kutusunda DesktopApp yazıyor.

  3. 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.

  4. Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.

    Visual Studio 2017'de DesktopApp Project'e yeni öğe eklemeyi gösteren animasyon.

    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.

  5. 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.

    Visual Studio 2017'de Yeni Öğe Ekle iletişim kutusunun ekran görüntüsü. Yüklü > Visual C artı artı sol tarafta seçilidir ve C artı artı Dosya seçeneği vurgulanır.

Projeniz oluşturulur ve kaynak dosyanız düzenleyicide açılır.

Visual Studio 2015'te Windows masaüstü projesi oluşturmak için

  1. Dosya menüsünde Yeni'yive ardından Proje'yi seçin.

  2. 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.

    Visual Studio 2015'te Yüklü > Şablonlar > Visual C artı > Win32 seçili, Win32 Projesi seçeneği vurgulanmış ve Ad metin kutusuna DesktopApp yazılan Yeni Proje iletişim kutusunun ekran görüntüsü.

  3. Win32 Uygulama Sihirbazı'nın Genel Bakış sayfasında İleri'yi seçin.

    Win32 Uygulama Sihirbazı'nda DesktopApp Oluşturma Genel Bakış sayfası.

  4. 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.

  5. Çözüm Gezgini DesktopApp projesine sağ tıklayın, Ekle'yi ve ardından Yeni Öğe'yi seçin.

    Visual Studio 2015'te DesktopApp Project'e yeni öğe eklemeyi gösteren animasyon.

    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.

  6. 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.

    Visual Studio 2015'te Yüklü > Visual C artı artı ve C artı Dosya seçeneğinin vurgulandığı Yeni Öğe Ekle iletişim kutusunun ekran görüntüsü.

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

  1. 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 bir WinMain 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 da HINSTANCE_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.

  2. Windows masaüstü programları gerektirir <windows.h>. ayrıca sık sık görürsünüz #include <tchar.h>. Bu, veya wchar_tile char çalışabilecek bir uygulama yazmayı kolaylaştırmaktır. Bunun yerine kodunuzdaki makroyu TCHAR kullanmanızdır. Bu, simge projenizde tanımlanıyorsa sonuç olarak wchar_t çözümleniyor, UNICODE aksi takdirde olarak çözümleniyor char. Her zaman UNICODE etkin olarak derlediyseniz, gerekmez TCHAR ve doğrudan kullanabilirsiniz wchar_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>
    
  3. İşlevle birlikte, her Windows masaüstü uygulamasının WinMain da bir pencere yordamı işlevi olmalıdır. Bu işlev olarak WndProcadlandı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

  1. işlevinde WinMain , ana pencerenizle ilgili bazı temel bilgileri yakalamanız gerekir. Bunu, türünde WNDCLASSEXbir 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 tipik WNDCLASSEX 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. .

  2. 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ız TCHAR 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;
    }
    
  3. 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 HWNDpencere 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.

  4. 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.

  5. İ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 ve DispatchMessage.

    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

  1. Uygulamanın aldığı iletileri işlemek için işlevinizde WndProc bir switch 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 bir WM_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ı BeginPaintyapı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ın EndPaint. Bu uygulama için ve arasındaki BeginPaint()EndPaint() kod içinde oluşturduğunuz WinMain()pencerede görüntülenirHello, Windows desktop!. Aşağıdaki kodda TextOut 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 ve EndPaint 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.

  2. Bir uygulama genellikle diğer birçok iletiyi işler. Örneğin, WM_CREATE bir pencere ilk oluşturulduğunda ve WM_DESTROY pencere kapatıldığında gönderilir. Aşağıdaki kod, temel ama eksiksiz WndProc 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

  1. 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;
    }
    
  2. Derle menüsünde Çözüm Derle'yi seçin. Derlemenin sonuçları Visual Studio'daki Çıkış penceresinde görünür.

    DesktopApp Projesi oluşturma adımlarını gösteren animasyon.

    Animasyonda tümünü kaydet düğmesine tıkladıktan sonra ana menüden Derleme > Derleme Çözümü'ne tıklanması gösterilir.

  3. Uygulamayı çalıştırmak için F5 tuşuna basın. "Merhaba, Windows masaüstü!" metnini içeren bir pencere görünmelidir.

    Çalışan projenin ekran görüntüsü. Windows Masaüstü Destekli Tur Uygulaması başlıklı bir pencere gösterir. Pencerenin içeriği Hello, Windows masaüstü! şeklindedir.

Tebrikler! Geleneksel bir Windows masaüstü uygulaması oluşturdunuz.

Ayrıca bkz.

Windows C++ masaüstü uygulama türleri