#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;        //声明用来处理消息的函数

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
    static TCHAR szAppName[] = TEXT("MyWindow") ;
    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass ;        //声明一个窗口类对象

    //以下为窗口类对象wndclass的属性
    wndclass.style = CS_HREDRAW | CS_VREDRAW ;                         //窗口样式
    wndclass.lpszClassName = szAppName ;                               //窗口类名
    wndclass.lpszMenuName = NULL ;                                     //窗口菜单:无
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) ;    //窗口背景颜色
    wndclass.lpfnWndProc = WndProc ;                                   //窗口处理函数
    wndclass.cbWndExtra = 0 ;                                          //窗口实例扩展:无
    wndclass.cbClsExtra = 0 ;                                          //窗口类扩展:无
    wndclass.hInstance = hInstance ;                                   //窗口实例句柄
    wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ) ;               //窗口最小化图标:使用缺省图标
    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ;                 //窗口采用箭头光标

    if( !RegisterClass( &wndclass ) )
    {    //注册窗口类, 如果注册失败弹出错误提示
        MessageBox( NULL, TEXT("窗口注册失败!"), TEXT("错误"), MB_OK | MB_ICONERROR ) ;
        return 0 ;
    }

    hwnd = CreateWindow(                   //创建窗口
                szAppName,                 //窗口类名
                TEXT("我的窗口"),           //窗口标题
                WS_OVERLAPPEDWINDOW,       //窗口的风格
                CW_USEDEFAULT,             //窗口初始显示位置x:使用缺省值
                CW_USEDEFAULT,             //窗口初始显示位置y:使用缺省值
                CW_USEDEFAULT,             //窗口的宽度:使用缺省值
                CW_USEDEFAULT,             //窗口的高度:使用缺省值
                NULL,                      //父窗口:无
                NULL,                      //子菜单:无
                hInstance,                 //该窗口应用程序的实例句柄
                NULL                       //
            ) ;

    ShowWindow( hwnd, iCmdShow ) ;        //显示窗口
    UpdateWindow( hwnd ) ;                //更新窗口

    while( GetMessage( &msg, NULL, 0, 0 ) )        //从消息队列中获取消息
    {
        TranslateMessage( &msg ) ;                 //将虚拟键消息转换为字符消息
        DispatchMessage( &msg ) ;                  //分发到回调函数(过程函数)
    }
    return msg.wParam ;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    HDC hdc ;                //设备环境句柄
    PAINTSTRUCT ps ;         //绘制结构
    RECT rect;               //矩形结构

    switch( message )        //处理得到的消息
    {
    case WM_CREATE:          //窗口创建完成时发来的消息
        MessageBox( hwnd, TEXT("窗口已创建完成!"), TEXT("我的窗口"), MB_OK | MB_ICONINFORMATION ) ;
        return 0;

    case WM_PAINT:           //处理窗口区域无效时发来的消息
        hdc = BeginPaint( hwnd, &ps ) ;
        GetClientRect( hwnd, &rect ) ;
        DrawText( hdc, TEXT( "Hello, 这是我自己的窗口!" ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER ) ;
        EndPaint( hwnd, &ps ) ;
        return 0 ;

    case WM_LBUTTONDOWN:     //处理鼠标左键被按下的消息
        MessageBox( hwnd, TEXT("鼠标左键被按下。"), TEXT("单击"), MB_OK | MB_ICONINFORMATION ) ;
        return 0;

    case WM_DESTROY:         //处理窗口关闭时的消息
        MessageBox( hwnd, TEXT("关闭程序!"), TEXT("结束"), MB_OK | MB_ICONINFORMATION ) ;
        PostQuitMessage( 0 ) ;
        return 0;
    }
    return DefWindowProc( hwnd, message, wParam, lParam ) ;        //DefWindowProc处理我们自定义的消息处理函数没有处理到的消息
}

C语言窗口例子的更多相关文章

  1. gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)

    第一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html gRPC in ASP.NET Core 3.x -- Protocol Buf ...

  2. 自学SQL语言的例子(使用MySQL实现)

    SQL语言作为一种数据库管理的标准语言有着极为广泛的应用场景,菜鸟入门选用的数据库软件是轻量级的免费(这个极为重要)的MySQL,下载链接如下:http://www.mysql.com/downloa ...

  3. go语言从例子开始之Example10.map(字典)

    map 是 Go 内置关联数据类型(在一些其他的语言中称为哈希 或者字典 ) package main import "fmt" func main() { 要创建一个空 map, ...

  4. go语言从例子开始之Example13.函数多返回值

    Go 内建多返回值 支持.这个特性在 Go 语言中经常被用到,例如用来同时返回一个函数的结果和错误信息. Example: package main import "fmt" // ...

  5. go语言从例子开始之Example20.错误处理

    Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby 以及在 C 语言中经常见到的超重的单返回值/错误值相比,Go 语言的处理方式能清楚的知道哪个函数返回了错 ...

  6. NS3 利用Gnuplot生成拥塞窗口例子fifth.cc的png图像

    参考链接:一个ns-3的Gnuplot例子 命令: (1)首先将fifth.cc拷贝到scratch目录下(由于环境变量的因素,./waf编译只对scratch目录下的文件有效,也可以忽略此步,直接. ...

  7. go语言从例子开始之Example39.使用函数自定义排序

    有时候我们想使用和集合的自然排序不同的方法对集合进行排序.例如,我们想按照字母的长度而不是首字母顺序对字符串排序.这里是一个 Go 自定义排序的例子. Example: package main im ...

  8. go语言从例子开始之Example38.排序

    Go 的 sort 包实现了内置和用户自定义数据类型的排序功能.我们首先关注内置数据类型的排序. Example: package main import ( "fmt" &quo ...

  9. go语言从例子开始之Example37.Go 状态协程

    在前面的例子中,我们用互斥锁进行了明确的锁定来让共享的state 跨多个 Go 协程同步访问.另一个选择是使用内置的 Go协程和通道的的同步特性来达到同样的效果.这个基于通道的方法和 Go 通过通信以 ...

随机推荐

  1. spring的事务操作(重点)

    这篇文章一起来回顾复习下spring的事务操作.事务是spring的重点, 也是面试的必问知识点之一. 说来这次面试期间,也问到了我,由于平时用到的比较少,也没有关注过这一块的东西,所以回答的不是特别 ...

  2. python websocket 再线聊天室的 Demo

    服务端 import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import ...

  3. Libsvm Java

    在java环境下用Libsvm包解决一个多分类问题. 1.将训练数据和测试数据按照libsvm的数据格式存放 可以写程序直接构造,libsvm的数据格式如下 Label 1:value 2:value ...

  4. intel xeon家族介绍

    Xeon - Intel   < intel Xeon Past and current logos         Developer Intel Manufacturer Intel Typ ...

  5. Js有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

    <!DOCTYPE html> <title>Title</title> <script> var arr = [1,2,3,4,11]; var s ...

  6. bottle源码

    import sys __author__ = 'Marcel Hellkamp' __version__ = '0.13-dev' __license__ = 'MIT' ############# ...

  7. C#替换文件中特定字符串,按照原来的编码格式保存

    private void button1_Click(object sender, EventArgs e) { var txt1 = "E:\\Temp\\local"; str ...

  8. Linux中硬链接和软链接的区别

    看了这篇文章之后,豁然开朗.直接放链接,感谢作者的分享. https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#ico ...

  9. Effective C++ 笔记:条款 33 避免继承导致的名称遮掩

    Avoid hiding inherited names 作用域(scopes)所带来的名称二义性,c++编译器会寻找指涉(refer to)的对象并实现名称遮掩规则(name-hiding rule ...

  10. Desktop Central 的移动设备管理功能

    Desktop Central 的移动设备管理功能1.移动应用程序管理设备管理不会仅仅只是配置策略.检索资产信息和保护设备.应用程序管理与设置员工的移动设备一样重要.使用 Desktop Centre ...