| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 359 人关注过本帖
标题:求助:请教一个窗口程序中的几个问题
只看楼主 加入收藏
lrongh
Rank: 2
等 级:论坛游民
帖 子:39
专家分:24
注 册:2009-10-6
结帖率:100%
收藏
 问题点数:0 回复次数:0 
求助:请教一个窗口程序中的几个问题
代码如下:
#include   <windows.h>
struct{
    int iStyle;
    TCHAR   *szText;
}button[]={
    BS_PUSHBUTTON,TEXT("PUSHBUTTON"),
    BS_DEFPUSHBUTTON,TEXT("DEFPUSHBUTTON"),
    BS_CHECKBOX,TEXT("CHECKBOX"),
    BS_AUTOCHECKBOX,TEXT("AUTOCHECKBOX"),
    BS_RADIOBUTTON,TEXT("RADIOBUTTON"),
    BS_3STATE,TEXT("3STATE"),
    BS_AUTO3STATE,TEXT("AUTO3STATE"),
    BS_GROUPBOX,TEXT("GROUPBOX"),
    BS_AUTORADIOBUTTON,TEXT("AUTORADIO"),
    BS_OWNERDRAW,TEXT("OWNERDRAW")
};
#define NUM (sizeof button / sizeof button[0])
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR szCmdLine,int iCmdShow){
    static TCHAR szAppName[]=TEXT("BtnLook");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style=CS_HREDRAW|CS_VREDRAW;
    wndclass.lpfnWndProc=WndProc;
    wndclass.cbClsExtra =0;
    wndclass.cbWndExtra =0;
    wndclass.hInstance =hInstance;
    wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName=NULL;
    wndclass.lpszClassName=szAppName;
    if   (!RegisterClass(&wndclass)){
        MessageBox(NULL,TEXT("This program requires Windows NT!"),
        szAppName,MB_ICONERROR);
        return 0;
    }
    hwnd=CreateWindow(
      szAppName,
      TEXT("Button Look"),
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,   
      CW_USEDEFAULT,
      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){
    static HWND hwndButton[NUM];
    static RECT rect;
    static TCHAR szTop[]=TEXT("message wParam lParam"),
                 szUnd[]=TEXT(""),
                 szFormat[]=TEXT("%-16s%04X-%04X%04X-%04X"),
                 szBuffer[50];
    static int cxChar,cyChar;
    HDC hdc;
    PAINTSTRUCT ps;
    int i;
    switch(message){
      case WM_CREATE:
        cxChar=LOWORD(GetDialogBaseUnits());
        cyChar=HIWORD(GetDialogBaseUnits());
        for(i=0;i<NUM;i++)
             hwndButton[i]=CreateWindow(
              TEXT("button"),
              button[i].szText,
              WS_CHILD|WS_VISIBLE|button[i].iStyle,
              cxChar,
              cyChar *(1+2*i),
              20*cxChar,
              7*cyChar/4,
              hwnd,
              (HMENU)i,
              ((LPCREATESTRUCT)lParam)->hInstance,
              NULL);
        break;
      case WM_SIZE:
        rect.left=24*cxChar;
        rect.top=2*cyChar;
        rect.right=LOWORD(lParam);
        rect.bottom=HIWORD(lParam);
        break;
      case WM_PAINT:
        InvalidateRect(hwnd,&rect,TRUE);
        hdc=BeginPaint(hwnd,&ps);
        SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
        SetBkMode(hdc,TRANSPARENT);
        TextOut(hdc,24*cxChar,cyChar,szTop,lstrlen(szTop));
        TextOut(hdc,24*cxChar,cyChar,szUnd,lstrlen(szUnd));

        EndPaint(hwnd,&ps);
        break;
      case WM_DRAWITEM:
      case WM_COMMAND:
        ScrollWindow(hwnd,0,-cyChar,&rect,&rect);
        hdc=GetDC(hwnd);
        SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
        TextOut(hdc,
          24*cxChar,
          cyChar*(rect.bottom/cyChar-1),
          szBuffer,
          wsprintf(szBuffer,szFormat,
            message==WM_DRAWITEM?TEXT("WM_DRAWITEM"):TEXT("WM_COMMAND"),
            HIWORD(wParam),
            LOWORD(wParam),
            HIWORD(lParam),
            LOWORD(lParam)));
        ReleaseDC(hwnd,hdc);
        ValidateRect(hwnd,&rect);
        break;
      case WM_DESTROY:
        PostQuitMessage(0);
        break   ;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}
疑问一:前面两个TextOut的输出坐标一样,如何解释?而且,szUnd此时应该是一个空字串吧?这条语句起什么作用?
疑问二:ScrollWindow函数的最后一个参数有什么作用?它的倒数第二个参数不是已经指出了滚动区域了吗?为什么要多此一举?
疑问三:WM_DRAWITEM消息和WM_COMMAND消息如何产生?为什么注释掉WM_COMMAND消息的处理语句后程序根本不会显示?
本人刚学窗口程序,稀里糊涂的,恳请老师指点!
搜索更多相关主题的帖子: 窗口 
2009-10-31 19:37
快速回复:求助:请教一个窗口程序中的几个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016043 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved