8.27_Windows窗口响应鼠标、键盘并退出询问

Windows窗口响应鼠标、键盘并退出询问


软件版本VC++ 6.0,新建一个应用程序外壳:

  • 【File】-【new】- Projects【Win32 Application】- input projectname -【OK】
  • 【An empty project】-【Finish】-【OK】

为应用程序添加源文件:

  • 【File】-【new】- Files【Win32 Application】- input filename -【OK】

写入代码如下

1. 头文件:

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

2. 窗口过程函数的声明(一般包含在[.h]的文件中,除此都为cpp文件):

LRESULT CALLBACK WinSunProC(
  HWND hwnd,                   //handle to window——窗口句柄
  UINT uMsg,                   //message identifier——消息代码
  WPARAM wParam,               //first message parameter——消息代码的两个参数
  LPARAM lParam                //second message parameter
);

3. WinMain函数(windows程序的入口点函数,与DOS程序的入口点函数main作用相同,当WinMain函数结束或返回时,Windows应用程序结束):

int WINAPI WinMain(
  HINSTANCE hInstance,             //handle to current instance——该程序当前运行的实例的句柄  
  HINSTANCE hPrecInstance,         //handle to precious instance——当前实例的前一个实例的句柄
  LPSTR lpCmdLine,                 //commend line——指定传给应用程序的命令行参数
                                   //(exp.记事本软件打开txt文件时,定参为文件的路径)
  int nCmdShow                     //show state——指定程序的窗口如何显示(通常不理会)
)
{

4. 设计一个窗口类:

WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;                       //这两个用不上给0就行
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//(强转)窗口背景为黑色
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); //鼠标光标为十字光标
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);     //最小化图标
wndcls.hInstance=hInstance;                //实例句柄
wndcls.lpfnWndProc=WinSunProc;             //窗口处理过程(=上面自己取的名字,待会下面自己再定义)
wndcls.lpszClassName="Angie_Drinking";     //窗口类名
wndcls.lpszMenuName=NULL;                  //窗口菜单
wndcls.style=CS_HREDRAW|CS_VREDRAW;        //窗口类型
RegisterClass(&wndcls);

——————————————注释: *MSDN 中对于 WNDCLASS 的定义—————————————-

typedef  struct _WNDCLASS { 
    UINT       style;   
    WNDPROC    lpfnWndProc; 
    int        cbClsExtra;
    int        cbWndExtra; 
    HINSTANCE  hInstance; 
    HICON      hIcon; 
    HCURSOR    hCursor; 
    HBRUSH     hbrBackground; 
    LPCTSTR    lpszMenuName; 
    LPCTSTR    lpszClassName; 
} WNDCLASS, *PWNDCLASS; 

style

  • Specifies the class style(s). This member can be any combination of the class styles.
Style Action
CS_BYTEALIGNCLIENT 在字节边界上(在x方向上)定位窗口的用户区域的位置。
CS_BYTEALIGNWINDOW 在字节边界上(在x方向上)定位窗口的位置
CS_CLASSDC 该窗口类的所有窗口实例都共享一个窗口类DC
CS_DBLCLKS 允许向窗口发送双击鼠标键的消息。
CS_GLOBALCLASS 当调用CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的hInstance参数和注册窗口类时传递给RegisterClass 的 hInstance参数不同。如果不指定该风格,则这两个 hInstance 必须相同。
CS_HREDRAW 当水平长度改变或移动窗口时,重画整个窗口
CS_VREDRAW 当垂直长度改变或移动窗口时,重画整个窗口
CS_NOCLOSE 禁止系统菜单的关闭选项
CS_OWNDC 给予每个窗口实例它本身的DC(设备描述表(Device Context),简称DC)。注意,尽管这样是很方便,但它必须慎重使用,因为每个DC大约要占800个字节的内存。
CS_PARENTDC 将子窗口的裁剪区域设置到父窗口的DC中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从系统缓存中获取DC,而不是使用父窗口的DC。使用该风格可以提高系统性能。
CS_SAVEBITS 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息。该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失。设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存。

lpfnWndProc

  • Pointer to the window procedure. You must use the CallWindowProc function to call the window procedure.
  • 窗口处理过程(=上面自己取的名字,待会下面自己再定义里面的内容)

cbClsExtra
- Specifies the number of extra bytes to allocate following the window-class structure. The system initializes the bytes to zero.
cbWndExtra
- Specifies the number of extra bytes to allocate following the window instance. The system initializes the bytes to zero.

hInstance

  • Handle to the instance that contains the window procedure for the class.
  • 标识了该窗口类的窗口过程所在的模块实例的句柄,不能为NULL

hIcon

  • Handle to the class icon. This member must be a handle to an icon resource. If this member is NULL, the system provides a default icon.
  • 标识了该窗口类的图标。hIcon字段必须是一个图标的句柄;若hIcon字段为NULL,那么系统将提供一个默认的图标。
LoadIcon(NULL,下面的选项) 如果要使用系统的图标
IDI_APPLICATION 默认程序图标(编译器图形)
IDI_ASTERISK Asterisk icon.(蓝底圆形感叹号)
IDI_ERROR Hand-shaped icon.(红底圆形一个叉)
IDI_EXCLAMATION 感叹号图标(黄底三角感叹号)
IDI_HAND Hand-shaped icon.
IDI_INFORMATION Asterisk icon.
IDI_QUESTION 疑问号图标(蓝底圆形一个问号)
IDI_WARNING 感叹号图标
IDI_WINLOGO windows的logo图标(编译器图形)

hCursor

  • Handle to the class cursor. This member must be a handle to a cursor resource. If this member is NULL, an application must explicitly set the cursor shape whenever the mouse moves into the application’s window.
  • 标识该窗口类的光标,hCursor必须是一个光标资源的句柄。若hCursor字段为NULL,则无论何时鼠标移到应用程序窗口时,应用程序必须显式设置光标形状。
LoadCursor(NULL,下面的选项) 如果要使用系统的图案
IDC_APPSTARTING 标准的箭头和小沙漏
IDC_ARROW 标准的箭头
IDC_CROSS 十字光标
IDC_HELP 标准的箭头和问号
IDC_IBEAM 工字光标
IDC_NO 禁止圈
IDC_SIZEALL 四向箭头指向东、西、南、北
IDC_SIZENESW 双箭头指向东北和西南
IDC_SIZENS 双箭头指向南北
IDC_SIZENWSE 双箭头指向西北和东南
IDC_SIZEWE 双箭头指向东西
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏

hbrBackground

  • Handle to the class background brush. This member can be a handle to the physical brush to be used for painting the background, or it can be a color value. A color value must be one of the following standard system colors (the value 1 must be added to the chosen color). If a color value is given, you must convert it to one of the following HBRUSH types:
  • 标识了该窗口类的背景画刷。hbrBackground字段必须是用于绘制背景的物理刷子的句柄,或者是一个颜色的值。如果给出一个颜色的值,它必须是下面列出的标准系统颜色之一(系统将对所选颜色加1)。如果给出了颜色值,它必须是转换成下列的HBRUSH类型之一的颜色:
GetStockObject ( fnObject:指定对象的类型,该参数可取如下值之一) 意义
BLACK_BRUSH 黑色画刷
DKGRAY_BRUSH 暗灰色画刷
DC_BRUSH 在Windows98,Windows NT 5.0和以后版本中为纯颜色画刷,缺省色为白色,可以用SetDCBrushColor函数改变颜色
GRAY_BRUSH 灰色画刷笔
HOLLOW_BRUSH 空画刷(相当于NULL_BRUSH)
NULL_BRUSH 空画刷(相当于HOLLOW_BRUSH)
LTGRAY_BRUSH 亮灰色画刷
WHITE_BRUSH 白色画刷
BLACK_PEN 黑色钢笔
DC_PEN 在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分
WHITE_PEN 白色钢笔

lpszMenuName

  • Pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the resource file.
  • 指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。

lpszClassName

  • Pointer to a null-terminated string or is an atom. If this parameter is an atom, it must be a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpszClassName; the high-order word must be zero
  • 指向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个字符串,它描述了窗口类名。这个类名可以是由RegisterClass或RegisterClassEx注册的名字,或者是任何预定义的控件类名。

—————————————————————–结束注释—————————————————————
5. 创建窗口,定义一个用变量来保存成功创建窗口后:

HWND hwnd;
hwnd=CreateWindow("Angie_Drinking","http",    //第二个“”里是弹出框顶端条的文字
    WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);

6. 显示及刷新窗口:

ShowWindow(hwnd,SW_SHOWNORMAL);            //激活并显示一个窗口。
UpdateWindow(hwnd);   //刷新

BOOL ShowWindow(HWND hWnd, int nCmdShow) nCmdShow:指定窗口如何显示
SW_FORCEMINIMIZE 在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。nCmdShow=11。
SW_HIDE 隐藏窗口并激活其他窗口。nCmdShow=0。
SW_MAXIMIZE 最大化指定的窗口。nCmdShow=3。
SW_MINIMIZE 最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
SW_RESTORE 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
SW_SHOW 在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
SW_SHOWDEFAULT 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
SW_SHOWMAXIMIZED 激活窗口并将其最大化。nCmdShow=3。
SW_SHOWMINIMIZED 激活窗口并将其最小化。nCmdShow=2。
SW_SHOWMINNOACTIVE 窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
SW_SHOWNA 以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
SW_SHOWNOACTIVATE 以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
SW_SHOWNORMAL 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。

7. 定义消息结构体,开始消息循环:

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return msg.wParam;
}

8. 编写窗口过程函数:

LRESULT CALLBACK WinSunProc
(
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
    switch(uMsg)
    {
        case WM_CHAR:
            char szChar[20];
            sprintf(szChar,"char code is %d",wParam);
            MessageBox(hwnd,szChar,"char",0);
            break;
  • WM_CHAR消息是步骤7中TranslateMessage(&msg);在用户在窗口中按下一个字符键时转换出来的,在wParam中含有字符的ASCII码值。
        case WM_LBUTTONDOWN:
            MessageBox(hwnd,"mouse clicked","message",0);
            HDC hdc;
            hdc=GetDC(hwnd);
            TextOut(hdc,0,50,"hello",strlen("hello"));
            break;
  • 当用户按下鼠标左键时将产生WM_LBUTTONDOWN消息,并且用MessageBox来响应,接下来在
        case WM_PAINT:
            HDC hDC;
            PAINTSTRUCT ps;
            hDC=BeginPaint(hwnd,&ps);
            TextOut(hDC,0,0,"hello world!",strlen("hello world!"));
        case WM_CLOSE:
            if(IDYES==MessageBox(hwnd,"quit?","message",MB_YESNO))
            {
                DestroyWindow(hwnd);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ ( n ) = ( n 1 ) ! n N
  • 块级公式:

x = b ± b 2 4 a c 2 a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.2 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.2 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 1.达成、

猜你喜欢

转载自blog.csdn.net/weixin_38593332/article/details/82109627