《windows核心编程》笔记(一)——第一章:API

1、UNREFERENCED_PARAMETER的用处

    作用:告诉编译器,已经使用了该变量,不必检测警告!
    换句话说 UNREFERENCED_PARAMETER 展开传递的参数或表达式。其目的是避免编译器关于未引用参数的警告。许多程序员,包括我在内,喜欢用最高级别的警告 Level 4(/W4)进行编译。Level 4 属于“能被安全忽略的事件”的范畴。虽然它们可能使你难堪,但很少破坏你的代码。例如,在你的程序中可能会有这样一些代码行:
    int x=1;
    但你从没用到过 x。也许这一行是你以前使用 x 时留下来的,只删除了使用它的代码,而忘了删除这个变量。Warning Level 4 能找到这些小麻烦。所以,为什么不让编译器帮助你完成可能是最高级别的专业化呢?用Level 4 编译是展示你工作态度的一种方式。如果你为公众使用者编写库,Level 4 则是社交礼节上需要的。你不想强迫你的开发人员使用低级选项清洁地编译他们的代码。

2、LoadString的用法

/**
参数1: hInstance是应用程序实例句柄。

参数2: uID是资源中的字符串编号。uID在string table中定义的。

参数3: lpBuffer是接收从资源里拷贝字符串出来的缓冲区。

参数4: nBufferMax是指明缓冲的大小。
*/

// 初始化全局字符串,uID在string table中定义的。
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_ERRORSHOW, szWindowClass, MAX_LOADSTRING);
View Code

3、MAKEINTRESOURCE,LoadIcon,LoadCursor的用法

wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ERRORSHOW));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
View Code

    MAKEINTRESOURCE是一个资源名转换的宏,这个宏是把一个数字类型转换成指针类型的宏,它不存在释放的问题。

    #define IDC_ARROW           MAKEINTRESOURCE(32512),是系统定义的,用于初始化光标类型

4、RegisterClassEx,CreateWindow,ShowWindow,UpdateWindow的用法

HWND CreateWindow(   
    LPCTSTR lpClassName,   
    LPCTSTR lpWindowName, 
     DWORD dwStyle,  
    int x,   
    int y,   
    int nWidth,   
    int nHeight, 
    HWND hWndParent,   
    HMENU hMenu,   
    HANDLE hInstance,   
    PVOID lpParam ); 

eg:hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
View Code

5、LOWORD,HIWORD的用法

    分别取得DWORD类型值的低、高32位值

6、DialogBox,EndDialog,DestroyWindow,EnableWindowDefWindowProcPostQuitMessage,BeginPaint,EndPaint的用法 

//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND    - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY    - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // 分析菜单选择:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: 在此添加任意绘图代码...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
View Code

    DestroyWindow用于销毁一个窗口。
    PostQuitMessage用于退出当前线程,前提是该线程必须有消息循环,否则用这个函数退出不了,没有消息循环的直接退出线程函数即可。如果当前线程是主线程,那么整个程序就退出了。
    ExitProcess用于退出整个程序,不过很少用,因为只要main函数返回了,程序就自动退出了。

 7、DialogBoxParam的用法

    函数功能:该函数根据对话框模板资源创建一个模态的对话框。在显示对话框之前,函数将一个应用程序定义的值传到对话框过程中 WM_INITDIALOG 消息的 lParam 参数,应用程序可用此值来初始化对话框。
    函数原型:int DialogBoxParam(HINSTANCE hInstance,LPCTSTR IpTemplateName,HWND hWndParent, DLGPROC IPDialogFunc,LPARAM dwlnitParam);
    参数:
      hlnstance:标识一个模块的事例,该模块的可执行文件含有对话框模板。
      IpTemplateName:标识对话框模板。此参数可以指向一个以NULL结尾的字符串的指针,该字符串指定对话框模扳名,或是指定对话框模板的资源标识符的一个整型值。如果此参数指定了一个资源标识符,则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE宏指令创建此值。
      hWndParent:指定拥有对话框的窗口。
      IpDialogFunc:指向对话框过程的指针。有关更详细的关于对话框过程的信息,请参见DialogProc。
      dwInitParam:指定传递到对话框过程中的 WM_INITDIALOG 消息 IParam 参数的值。
    返回值:如果函数调用成功则返回值为在对函数EndDialog的调用中的nResult参数,该EndDialog函数用于中止对话框。如果函数调用失败,则返回值为-1。若想获得错误信息,请调用GetLastError函数。
    备注:DialogBoxParam函数用CreateWindowEx函数创建对话框。然后把一个WM_INITDIALOGG消息传递到对话框过程。如果模板指定DS_SETFONT类型,DialogBoxParam函数把一个WM_SETFONT消息传递到对话框过程。(不管模板是否指定WS_VISIBLE类型),函数显示对话框使拥有窗口失效,且为对话框启动它本身的消息循环来检取和传递消息。当对话框应用程序调用EndDialog函数时,DialogBoxParam函数清除对话框中止消息循环;使拥有窗口生效(如果以前有效),且返回函数EndDialog的调用中的nReSUlt参数。Windows 95和以后版本:系统可支持每个对话框模板最多为255个控制。为把多于255个控制放入对话框,可以在WM_INITDLALOG消息处理器中创建控制,而不是把它们放入模板中。Windows CE:lpTemplateName参数指向的对话框模板中DLGTEMPLATE结构并不支持所有的类型。

8、FindWindow的用法

       FindWindow(
    lpClassName,        {窗口的类名}
    lpWindowName: PChar {窗口的标题}
    ): HWND;              {返回窗口的句柄; 失败返回 0}

    //FindWindowEx 比 FindWindow 多出两个句柄参数:
    FindWindowEx(
    Parent: HWND;     {要查找子窗口的父窗口句柄}
    Child: HWND;      {子窗口句柄}
    ClassName: PChar; {}
    WindowName: PChar {}
    ): HWND;
    {
    如果 Parent 是 0, 则函数以桌面窗口为父窗口, 查找桌面窗口的所有子窗口;
    如果  是 HWND_MESSAGE, 函数仅查找所有消息窗口;
    子窗口必须是 Parent 窗口的直接子窗口;
    如果 Child 是 0, 查找从 Parent 的第一个子窗口开始;
    如果 Parent 和 Child 同时是 0, 则函数查找所有的顶层窗口及消息窗口.    
View Code
HWND hwnd = FindWindow(TEXT("#32770"), TEXT("Error Show"));// TEXT("#32770")是对话框窗口类

9、isWindow的用法

    函数功能:该函数确定给定的窗口句柄是否标识一个已存在的窗口。

10、SetForegroundWindow的用法

    函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。

11、SendMessage的用法

    此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。

    LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
    参数
      hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
      Msg:指定被发送的消息。
      wParam:指定附加的消息特定信息。
      lParam:指定附加的消息特定信息。
    返回值:返回值指定消息处理的结果,依赖于所发送的消息。
    备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
如果指定的窗口是由正在调用的线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

12、Edit_LimitText,Edit_GetTextLength的用法

    Edit_LimitText是一个宏定义,最终就是给IDC_ERRORCODE这个hWnd发一个设置文本长度的消息。

    Edit_GetTextLength用来获得指定编辑控件中的字符数。这个宏调用了函数:GetWindowTextLength。

13、IsDlgButtonChecked的用法

    函数功能:该函数可以确定某个按钮控件是否有选中标志,或者三态按钮控制是否为灰色的、选中的、或两者都不是。
    函数原型:UINT IsDlgButtonChecked(HWND hDlg,Int nlDBUtton);
    参数:
      hDlg:指向包含按钮控制的对话框。
      nkDButtom:指定按钮控制的整型标识符。
    返回值:使用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTION或BS_3STATE样式创建的按钮的返回值可以是如下值之一:
      BST_CHECKED:表示按钮被选中。
      BST_INDETERMINATE:表示按钮是灰色的,即为不确定状态(只有具有BS_3STATE或BS_AUTO3STATE样式的按钮才使用该值)。
      BST_UNCHECKED:表示该按钮未选中(unckecked)。如果该按钮用其他任何样式,那么返回值为零。

14、SetWindowPos的用法

    该函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。
    子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个。

    有两种方法将窗口设为最顶层窗口:一种是将参数hWndlnsertAfter设置为HWND_TOPMOST并确保没有设置SWP_NOZORDER标志;另一种是设置窗口在Z序中的位置以使其在其他存在的窗口之上。当一个窗口被置为最顶层窗口时,属于它的所有窗口均为最顶层窗口,而它的所有者的z序并不改变。窗口。

15、MAKELANGID的用法

WORD MAKELANGID(
    USHORT usPrimaryLanguage,
    USHORT usSubLanguage
    );
 
DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);//本地语言

    用来从一个主语言标识符和从语言标识符创建一个语言标识符。

16、FormatMessage的用法

    FormatMessage是一个Windows API函数。它的功能就是将GetLastError函数得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数。

DWORD WINAPI FormatMessage (
             DWORD dwFlags, // source and processing options
             LPCVOID lpSource, // message source
             DWORD dwMessageId, // message identifier
             DWORD dwLanguageId, // language identifier
             LPTSTR lpBuffer, // message buffer
             DWORD nSize, // maximum size of message buffer
             va_list *Arguments // array of message inserts
             );
View Code

posted on 2014-10-27 10:10  匆匆那些年  阅读(581)  评论(0编辑  收藏  举报

导航