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

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 window\n");
            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, 0, 0, GetModuleHandle(0), 0 ) ;

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

原文地址:https://www.cnblogs.com/zjutzz/p/10806955.html

时间: 2024-11-08 13:06:36

windows下控制台程序实现窗口显示的相关文章

windows下控制台程序更改图标和加载资源文件

1.在空项目的Resouce FIles中右击创建一个新的.rc文件. 2.选中这个.rc文件右击在界面中选择导入icon 3.选中icon,将icon的ID更改为IDC_MAINFRAME. 4.重新编译. 原文地址:https://www.cnblogs.com/zhangdewang/p/9412848.html

Windows下Java程序实现对Mysql数据库的插入,删除,修改和查询

运行环境:Windows7,Eclipse,MySql,JDK1.7,mysql-connector-java-5.1.17-bin.jar 1 //import java.io.*; 2 import java.util.*; 3 import java.sql.*; 4 5 /** 6 * 7 * @date 2014-05-20 8 * @author asif 9 * @作用 java实现对mysql数据库的增减删查 10 * @bug 插入,删除,更新的时候异常停止 11 * 12 *

Windows下命令行Git无法显示中文问题解决方案

Windows下Git设置编码正常显示中文: 在 CMD 下设置环境变量 set LESSCHARSET=utf-8 在 PowerShell 下设置环境变量 $env:LESSCHARSET='utf-8'GitBash中正常显示中文: 打开Gitbash -> 右键->options ->左侧text->设置locale:zh_cn,设置Character set:GBK->save->apply 测试是否正常:GitBash输入 systeminfo看能否正常显示

隐藏windows任务栏中的窗口显示

在实际应用中遇到类似下列需要: 隐藏windows窗口,在windows任务栏中窗口不可见,但应用程序在后台运行. windows应用程序的窗口默认会在任务栏中添加一个可见的窗口项,方便用户操作和在不同应用程序中切换. 考虑到windows操作系统是基于shell的,查找shell的接口资料会发现 ITaskbarList interface .ITaskbarList提供了AddTab和DeleteTab函数,用于向任务栏中添加删除窗口项. 第一种方法就是使用ITaskbarList接口,在程

windows下.bat程序开机自启动的几种方法

以下两种方法,亲测能够执行的1.编写VBS脚本新建脚本script.vbs,脚本内容如下:set ws=WScript.CreateObject("WScript.Shell")ws.Run "C:\Users\Administrator\Desktop\aa.bat /start",0 //bat的存放路径 编写完保存后,点击开始->所有程序->启动,点击右键打开,把脚本放进去即可实现开机启动bat脚本 2.修改注册表点击开始->运行->r

windows下tomcat在当前窗口运行,不在新弹出的窗口运行

window下tomcat在当前窗口启动,不在一个新的窗口启动startup.bat中最下几行goto setArgs:doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS%:end----------把start改为runcall "%EXECUTABLE%" run %CMD_LINE_ARGS%

Visual Studio控制台程序输出窗口一闪而过的解决方法

写个Hello World的程序试一下,发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样.无论是在Visual Studio 2008.2010还是2012中都有这种情况出现,有些人可能会用下面两种方法中的一种: 在程序代码的最后加上system("pause")或者getchar().其实这是属于dos下的命令. 其实问题是你执行时按的是F5,而正确的应该是Ctrl+F5,这样窗口就会显示 Press any key to cont

转-Visual Studio控制台程序输出窗口一闪而过的解决方法

刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样.无论是在Visual Studio 2008.2010还是2012中都有这种情况出现,有些人可能会用下面两种方法中的一种: 在程序代码的最后加上system("pause")或者getchar().其实这是属于dos下的命令. 其实问题是你执行时按的是F5,而正确的应该是Ctrl+F5,这

(转)Visual Studio控制台程序输出窗口一闪而过的解决方法

背景:熟悉visiual studio工具的使用 刚接触 Visual Studio的时候大多数人会写个Hello World的程序试一下,有的人会发现执行结束后输出窗口会一闪而过,并没有出现Press any key to continue的字样.无论是在Visual Studio 2008.2010还是2012中都有这种情况出现,有些人可能会用下面两种方法中的一种: 在程序代码的最后加上system("pause")或者getchar().其实这是属于dos下的命令. 其实问题是你