加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows下控制台程序实现窗口显示

发布时间:2020-12-13 22:34:15 所属栏目:Windows 来源:网络整理
导读:windows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+。一般是在Visual Studio里新建Win32应用程序,而不是Win32 console application(控制台程序),然后使用GDI的一些API,例如CreateWindow、CreateWindowEx来实现窗口

windows下实现窗口显示,如果限定是C/C++语言,并且是原生Windows支持,需要使用GDI或GDI+。一般是在Visual Studio里新建Win32应用程序,而不是Win32 console application(控制台程序),然后使用GDI的一些API,例如CreateWindow、CreateWindowEx来实现窗口的创建、显示等。

实际上MSDN官方并没有说只能是Win32应用程序,控制台程序完全可以。个人并不习惯WinMain()函数,更习惯main(int argc,char** argv)。例如OpenCV的highgui模块,它里面的cvNamedWindow(),cvShowImage(),cvWaitKey()这几个函数,在windows下的实现,如果不考虑其opengl版本的话,它是基于GDI实现的;而作为一个广泛使用的图像处理库,OpenCV源码中并没有WinMain函数。

下面是用纯C实现的“调用GDI的API接口,实现控制台类型程序中显示窗口”的样例程序,改编自How do you create a Win32 window from Console Application?

#include <stdio.h>
#include <windows.h>

LRESULT __stdcall WindowProcedure(HWND window,unsigned int msg,WPARAM wp,LPARAM lp)
{
    switch(msg)
    {
        case WM_DESTROY:
            printf("ndestroying windown");
            PostQuitMessage(0) ;
            return 0L ;

        case WM_LBUTTONDOWN:
            printf("nmouse left button down at (%d,%d)n",LOWORD(lp),HIWORD(lp));

        // fall thru
        default:
            printf(".");
            return DefWindowProc( window,msg,wp,lp ) ;
    }
}

typedef struct MyRect{
    int x,y,width,height;
} MyRect;

int main()
{
    printf("hello world!n");

    const char* const myclass = "myclass" ;

    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    /* Win 3.x */
    wc.style = CS_DBLCLKS;
    wc.lpfnWndProc = WindowProcedure;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = GetModuleHandle(0);
    wc.hIcon = LoadIcon(0,IDI_APPLICATION);
    wc.hCursor = LoadCursor(0,IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = 0;
    wc.lpszClassName = myclass;
    /* Win 4.0 */
    wc.hIconSm = LoadIcon(0,IDI_APPLICATION);

    if(RegisterClassEx(&wc))
    {
        MyRect rect;
        rect.x = 300;
        rect.y = 300;
        rect.width = 640;
        rect.height = 480;

        HWND window = CreateWindowEx( 0,myclass,"title",WS_OVERLAPPEDWINDOW,rect.x,rect.y,rect.width,rect.height,GetModuleHandle(0),0 ) ;

        if(window)
        {
            ShowWindow( window,SW_SHOWDEFAULT ) ;
            MSG msg ;
            while( GetMessage( &msg,0 ) ) DispatchMessage(&msg);
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读