Hey,别搞错了Win32项目和Win32控制台程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshubo1989/article/details/48158017

你是否和我一样呢,写了很多控制台程序,特别熟悉cout、main函数等等。
但是你同样也听说过win32 api !!当在你的控制台应用程序中写下某个api函数的时候,你也许会窃喜api函数带来的方便。但是当你编译代码的时候,编译器会无情的通知你“不能识别XX标识符”。
所以,从现在开始我的blog.

你兴致勃勃的打开vs2010,选择“文件”-》“新建”-》“项目”,你会看到如下:
这里写图片描述
正如你所见到的,有一个win32控制台应用程序,有一个win32项目。有何区别呢?

控制台应用程序运行就是dos的界面
项目一般采用了可视化开发 开发出来的东西就像QQ之类的 是有窗口界面的

win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用程序…
win32项目指运行于32位Windows操作系统中的应用程序…包括win32控制台项目…

win32控制台的入口是main,win32项目的入口是WinMain。而程序的入口点是可以重新设置的。我们可以在console应用程序中设置其入口点为WinMain,反之亦然。在下面的代码中会有所展现!

下面代码是一个Win32项目,通过Win32 API函数来读写.ini文件。

#include<Windows.h> 
LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); 
int CALLBACK WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance,       __in LPSTR lpCmdLine, __in int nShowCmd ) 
{ 
    char szResult[255]; 
    char szDefault[255]; 
    char myPath[] = "D:\\myfile.ini"; 
    GetPrivateProfileString("MySection", "MyKey", "555", szResult, 255, myPath);   
    MessageBox(NULL, szResult, NULL, MB_OK);
    WritePrivateProfileString("MySection", "Mykey", "shit", myPath);  
    GetPrivateProfileString("MySection", "MyKey", "555", szResult, 255, myPath);   
    MessageBox(NULL, szResult, NULL, MB_OK); 
    return 0; 
}

下面是一个完整的Win32项目的代码,其中包括了 WinMain入口点,设计与注册窗口类,创建和显示窗口
更新窗口,消息循环,消息响应

#include <Windows.h>  
// 必须要进行前导声明  
LRESULT CALLBACK WindowProc(  
    _In_  HWND hwnd,  
    _In_  UINT uMsg,  
    _In_  WPARAM wParam,  
    _In_  LPARAM lParam  
);  

// 程序入口点  
int CALLBACK WinMain(  
    _In_  HINSTANCE hInstance,  
    _In_  HINSTANCE hPrevInstance,  
    _In_  LPSTR lpCmdLine,  
    _In_  int nCmdShow  
  )  
{  
    // 类名  
    WCHAR* cls_Name = L"My Class";  
    // 设计窗口类  
    WNDCLASS wc = { };  
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;  
    wc.lpfnWndProc = WindowProc;  
    wc.lpszClassName = cls_Name;  
    wc.hInstance = hInstance;  
    // 注册窗口类  
    RegisterClass(&wc);  

    // 创建窗口  
    HWND hwnd = CreateWindow(  
        cls_Name,           //类名,要和刚才注册的一致  
        L"我的应用程序",  //窗口标题文字  
        WS_OVERLAPPEDWINDOW, //窗口外观样式  
        38,                 //窗口相对于父级的X坐标  
        20,                 //窗口相对于父级的Y坐标  
        480,                //窗口的宽度  
        250,                //窗口的高度  
        NULL,               //没有父窗口,为NULL  
        NULL,               //没有菜单,为NULL  
        hInstance,          //当前应用程序的实例句柄  
        NULL);              //没有附加数据,为NULL  
    if(hwnd == NULL) //检查窗口是否创建成功  
        return 0;  

    // 显示窗口  
    ShowWindow(hwnd, SW_SHOW);  

    // 更新窗口  
    UpdateWindow(hwnd);  

    // 消息循环  
    MSG msg;  
    while(GetMessage(&msg, NULL, 0, 0))  
    {  
        TranslateMessage(&msg);  
        DispatchMessage(&msg);  
    }  
    return 0;  
}  
// 在WinMain后实现  
LRESULT CALLBACK WindowProc(  
    _In_  HWND hwnd,  
    _In_  UINT uMsg,  
    _In_  WPARAM wParam,  
    _In_  LPARAM lParam  
)  
{  
    switch(uMsg)  
    {  
    case WM_DESTROY:  
        {  
            PostQuitMessage(0);  
            return 0;  
        }  
    }  
    return DefWindowProc(hwnd, uMsg, wParam, lParam);  
}  

猜你喜欢

转载自blog.csdn.net/wangshubo1989/article/details/48158017