No MFC,Only API--状态栏的创建和使用

类别:VC语言 点击:0 评论:0 推荐:
 

No MFC,Only API--状态栏的创建和使用:

创建状态栏有两种方法:1,使用CreateStatusWindow函数;2,使用CreateWindowEx函数。无论调用哪一个函数,都要先调用InitCommonControls函数,以确保动态链接库成功加载。

状态栏的类型和样式:

状态栏的默认位置在窗口的低部,你可以指定CCS_TOP风格使其显示在客户区的顶部。指定SBARS_SIZEGRIP风格,在状态栏的右部显示改变窗口大小的把手。

注意:CCS_TOP 和 SBARS_SIZEGRIP不要同时指定,会导致拖放窗口大小的把手失效。

状态栏中的文本显示:

通过发送SB_SETTEXT消息,指定状态栏索引,字符串的指针。一般,文本的显示是左对齐,可以改变这一默认设置,使用'\t'使文本居中对齐,'\t\t'使文本右对齐。

为了显示状态信息而不想创建状态栏,可以使用DrawStatusText函数。这个函数用同状态栏相同的方法显示信息,只是它不自动设置显示状态信息的尺寸和位置。当调用这个函数后,就必须指定尺寸和位置。

在状态栏中显示响应菜单选项的提示信息,可通过MenuHelp函数,参数如下:

MenuHelp(    //MenuHelp参数介绍

UINT uMsg,      //此函数响应的消息类型WM_MENUSELECT或WM_COMMAND

WPARAM wParam,    //消息中的wParam

LPARAM lParam,    //消息中的lParam

HMENU hMainMenu,    //菜单栏句柄

HINSTANCE hInst,  //应用程序实例

HWND hwndStatus,    //状态栏句柄

LPUINT lpwIDs        //标志菜单索引的数组地址

);

范例1:状态栏的创建和使用

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include "resource.h"

#include <commctrl.h>

 

char *szAppName="Statusbar";

HINSTANCE g_hinst;

HWND g_statusbar;    //全局状态栏句柄

HMENU hMainMenu;    //全局菜单句柄

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

//声明创建状态栏的函数

HWND DoCreateStatusBar(HWND,int,HINSTANCE,int);

 

int APIENTRY WinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPSTR     lpCmdLine,

                     int       nCmdShow)

{

    MSG msg;

    HWND hWnd;

 

    WNDCLASSEX wc;

 

    wc.cbClsExtra                =0;

    wc.cbSize                    =sizeof(wc);

    wc.cbWndExtra                =0;

    wc.hbrBackground         =(HBRUSH)GetStockObject(WHITE_BRUSH);

    wc.hCursor                   =LoadCursor(NULL,IDC_ARROW);

    wc.hIcon                    =LoadIcon(NULL,IDI_APPLICATION);

    wc.hIconSm                   =0;

    wc.hInstance             =hInstance;

    wc.lpfnWndProc               =(WNDPROC)WndProc;

    wc.lpszClassName         =szAppName;

    wc.lpszMenuName              =MAKEINTRESOURCE(IDR_MENU1);

    wc.style                    =CS_VREDRAW | CS_HREDRAW |

        CS_OWNDC | CS_DBLCLKS;

 

    RegisterClassEx(&wc);

 

    hWnd=CreateWindowEx(0,szAppName,szAppName,WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,

        NULL,hInstance,NULL);

 

    hMainMenu=GetMenu(hWnd);

 

    g_hinst=hInstance;

//在此处,调用函数创建状态栏

    g_statusbar=

    DoCreateStatusBar(hWnd,60105,hInstance,4);

 

    ShowWindow(hWnd,nCmdShow);

    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;

//菜单项索引

    unsigned int mes[]={0,1,2};

 

    switch(message)

    {

    case WM_CREATE:

        return 0;

    case WM_MENUSELECT:

//当选择菜单项时,显示提示信息

        MenuHelp(WM_MENUSELECT,wParam,lParam,

            hMainMenu,g_hinst,g_statusbar,mes);

        return 0;

    case WM_SIZE:

//窗口大小改变时,重新创建状态栏并使原来状态栏消失

        DestroyWindow(g_statusbar);

        g_statusbar=

        DoCreateStatusBar(hWnd,60105,g_hinst,4);

        return 0;

    case WM_PAINT:

        hdc=BeginPaint(hWnd,&ps);

        //do drawing

        EndPaint(hWnd,&ps);

        return 0;

    case WM_CLOSE:

        PostQuitMessage(0);

        return 0;

    }

    return DefWindowProc(hWnd,message,wParam,lParam);

}

HWND DoCreateStatusBar(HWND hwndParent,//主窗口句柄

                       int nStatusID,  //状态栏标识符

                    HINSTANCE hinst,//应用程序实例

                       int nParts       //状态栏分为的份数

)

{

    HWND hwndStatus;

    RECT rcClient;

    HLOCAL hloc;

    LPINT lpParts;

    int i, nWidth;

 //加载动态连接库

    InitCommonControls();

 //创建状态栏

    hwndStatus = CreateWindowEx(

        0,

        STATUSCLASSNAME,

        (LPCTSTR) NULL,

        SBARS_SIZEGRIP |

        WS_CHILD | WS_VISIBLE,

        0, 0, 0, 0,

        hwndParent,

        (HMENU) nStatusID,

        hinst,

        NULL);

 

    GetClientRect(hwndParent, &rcClient);

 

    hloc = LocalAlloc(LHND, sizeof(int) * nParts);

    lpParts = (int*)LocalLock(hloc);

 //计算状态栏中每部分的宽度

    nWidth = rcClient.right / nParts;

    for (i = 0; i < nParts; i++)

    {

        lpParts[i] = nWidth;

        nWidth += nWidth;

    }

 //把状态栏分为几部分

    SendMessage(hwndStatus, SB_SETPARTS, (WPARAM) nParts,

        (LPARAM) lpParts);

 

    LocalUnlock(hloc);

    LocalFree(hloc);

//返回状态栏的句柄

    return hwndStatus;

}

如要在状态栏中显示其他信息,可以通过SendMessage函数发送SB_SETTEXT消息,在WPARAM中指定状态栏的索引,LPARAM中指定将要显示的字符串。

有任何意见,建议请 email:[email protected].

本文地址:http://com.8s8s.com/it/it2610.htm