• Windows编程学习笔记(二)


    这章的内容比繁琐,需要多用练习才能较熟练的掌握。

    第二章 输出文字

    /****************************************/

    WM_PAINT消息

    发生以下事件时窗口消息处理程序会接收到一个WM_PAINT消息:

    1. 当移动窗口时,窗口中先前被隐藏的区域重新可见

    2. 使用者改变窗口的大小,WM_SIZE

    3. 程序使用ScrollWindow ScrollDC函数滚动显示区域的一部分。

    4. 程序使用InvalidateRectInvalidateRgn函数刻意产生WM_PAINT消息。

    有时候Windows保存他所覆盖的显示区域,然后回复他,有以下情况:

    1. 鼠标传越过的区域

    2. 图标推过显示区域

    有效矩形和无效矩形

    Windows每次绘图时是针对某个区域来进行的,这个区域就是无效区域。

    Windows内部为每个窗口保存一个PaintStruct,这个结构中包含了包围无效区域的最小矩形,当又有一个无效矩形产生时,windows则会合并所有的无效矩形,计算出新的无效矩形,再将WM_PAINT放入消息队列中。

    我们可以用InvalidateRect来使显示区域内的矩形变为无效,而用ValidateRect是显示区域内的任意矩形区域变为有效,这样会把当前消息队列中的所有WM_PAINT消息都删除。

    /***********************************************/

    GDI(图形设备接口)

    最简单最普遍的文字输出函数是TextOutTextOut(hdc,x,y,psText,iLength);

    如果程序需要使用设备,就先必须得到该设备的句柄,有两种方法来得到设备的句柄,

    1. hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps);

    2. hdc = GetDC(hwnd); ReleaseDC(hdc);

    以上两种方法中的函数必须成对出现,否则会出现不可预知的错误。

    这种方法的比较,第一种常在wm_paint消息中使用,而且只能在ps定义的区域内绘图,而第二种方法却要灵活的多,可以在ps以外的任意处绘图,所以使用的更加方便。

    我们知道,WM_PAINT消息处理是,BeginPaint之后,程序是对ps定义的无效区域来绘图的,也就是说,我们可以通过改变ps结构来改变程序的无效区域。

    /**************************************************/

    下面是一个非常重要的函数:

    Invalidate(hwnd,&rect,bool);

    这个函数可以是rect的区域变为无效区域,第二个参数为NULL时,是对整个程序的区域作用,第三个参数很重要,当bool=TRUE时,windows会使rect区域无效,并擦除背景,当bool=FALSE时,windows会使rect无效,但不会擦出背景,原有的东西将保留在原处。

    比如说,画一个圆,另一个窗口覆盖了这个圆的一部分,而后又移开。当bool=TRUE时,程序会擦除背景,重新绘出此圆,当bool=FALSE,程序不会擦出背景,保留未被覆盖的圆的那一部分,而被覆盖的那部分则会显示为背景色。

    所以说灵活使用这个函数可以为我们的程序提供许多方便。

    /****************************************************/

    TextOut(hdc,x,y,psText,iLength);

    非常普遍的一个输出字体函数,参数不用说明,一看就知道。函数可以这样使用:
    TextOut(hdc,10,20,TEXT(“hello windows”),40);

    这种输出格式十分不灵活,如果循环输出递加的i值怎么办?我们可以用下面的方法:

    int iLength;

    TCHAR str[MAXN];

    for( int i = 0;i < cyClient/text_high; ++i) {

    iLength = wsprintf(str,TEXT("here is the number of %d"),i);

    TextOut(hdc,0,text_high*i,str,iLength);

    }

    其中wsprintf就像C中的printf一样,提供格式化字符串,功能异常强大,类似的还有函数sprintf,与wsprintf类似,不过有些不同,具体细节还徐有待学习,sprintf针对ASCII,而wsprintf针对unicode

    /*********************************************/

    TEXTMETRIC

    typedef struct tagTEXTMETRIC

    {

        LONG tmHeight ;

        LONG tmAscent ;

        LONG tmDescent ;

        LONG tmInternalLeading ;

        LONG tmExternalLeading ;

        LONG tmAveCharWidth ;

       LONG tmMaxCharWidth ;

               其它结构字段

    }

    如果程序中控制字体输出,那么必须知道字体的信息,使用GetTextMetrics(hdc,&tm)来获得信息,个字段信息如下:

    然后就可以结合TextOut来得到windows的基本字符处理输出的能力,效果如下(简陋啊):

     

  • 相关阅读:
    params可变参数
    using释放资源
    第二章:深入C#数据类型
    体检套餐项目解析
    堆栈
    C#必看:《第17章节QQ管理系统》
    C#必看:《第15章节学生管理系统》
    ACM hdu 1008 Elavator
    jq尺寸和位置总结篇(width scrollTop position offset)
    find children slice
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1662800.html
Copyright © 2020-2023  润新知