windows程序设计 「PopPad3」范例分析笔记

/*---------------------------------------
   POPPAD.C -- Popup Editor
               (c) Charles Petzold, 1998
  ---------------------------------------*/


#include <windows.h>
#include <commdlg.h>  //使用通用对话框,必须包含此头文件
#include "resource.h"   //资源文件

#define EDITID    1
#define UNTITLED TEXT ("(untitled) ")

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

     // Functions in POPFILE.C

void   PopFileInitialize      (HWND) ;
BOOL PopFileOpenDlg   (HWND, PTSTR, PTSTR) ;
BOOL PopFileSaveDlg    (HWND, PTSTR, PTSTR) ;
BOOL PopFileRead         (HWND, PTSTR) ;
BOOL PopFileWrite         (HWND, PTSTR) ;

     // Functions in POPFIND.C

HWND PopFindFindDlg        (HWND) ;
HWND PopFindReplaceDlg  (HWND) ;
BOOL PopFindFindText       (HWND, int *, LPFINDREPLACE) ;
BOOL PopFindReplaceText (HWND, int *, LPFINDREPLACE) ;
BOOL PopFindNextText      (HWND, int *) ;
BOOL PopFindValidFind      (void) ;

     // Functions in POPFONT.C

void PopFontInitialize           (HWND) ;
BOOL PopFontChooseFont   (HWND) ;
void PopFontSetFont            (HWND) ;
void PopFontDeinitialize       (void) ;

     // Functions in POPPRNT.C

BOOL PopPrntPrintFile (HINSTANCE, HWND, HWND, PTSTR) ;

     // 全局变量

static HWND  hDlgModeless ;
static TCHAR szAppName[] = TEXT ("PopPad ") ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     MSG         msg ;
     HWND      hwnd ;
     HACCEL    hAccel ;
     WNDCLASS  wndclass ;
   
     wndclass.style                    = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc        = WndProc ;
     wndclass.cbClsExtra           = 0 ;
     wndclass.cbWndExtra        = 0 ;
     wndclass.hInstance           = hInstance ;
     wndclass.hIcon                  = LoadIcon (hInstance, szAppName) ; //自定义图标
     wndclass.hCursor              = LoadCursor (NULL , IDC_ARROW ) ;
     wndclass.hbrBackground   = (HBRUSH) GetStockObject (WHITE_BRUSH ) ;
     wndclass.lpszMenuName   = szAppName ;                                    //自定义菜单
     wndclass.lpszClassName   = szAppName ;
   
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL , TEXT ("This program requires Windows NT! "),
                      szAppName, MB_ICONERROR ) ;
          return 0 ;
     }
   
     hwnd = CreateWindow (szAppName, NULL ,                   //初始时窗口标题栏无文字
                          WS_OVERLAPPEDWINDOW ,
                          CW_USEDEFAULT , CW_USEDEFAULT ,
                          CW_USEDEFAULT , CW_USEDEFAULT ,
                          NULL , NULL , hInstance, szCmdLine) ;
   
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;

     //加载快捷键资源到内存
     hAccel = LoadAccelerators (hInstance, szAppName) ;
   
     while (GetMessage (&msg, NULL , 0, 0))
     {
          //拦截非模态对话框消息
          if (hDlgModeless == NULL || !IsDialogMessage (hDlgModeless, &msg))
          {
               //拦截快捷键消息
               if (!TranslateAccelerator (hwnd, hAccel, &msg))
               {
                    TranslateMessage (&msg) ;
                    DispatchMessage (&msg) ;
               }
          }
     }
     return msg.wParam ;
}

void DoCaption (HWND hwnd, TCHAR * szTitleName)
{
     TCHAR szCaption[64 + MAX_PATH ] ;
     //将窗口名和打开的文件路径拼接起来,如果未打开任何文件则显示(UNTITLED)
     wsprintf (szCaption, TEXT ("%s - %s "), szAppName,
               szTitleName[0] ? szTitleName : UNTITLED ) ;
     //向标题栏写入文字
     SetWindowText (hwnd, szCaption) ;
}

void OkMessage (HWND hwnd, TCHAR * szMessage, TCHAR * szTitleName)
{
     TCHAR szBuffer[64 + MAX_PATH ] ;
     //拼接提示字符串
     wsprintf (szBuffer, szMessage, szTitleName[0] ? szTitleName : UNTITLED ) ;
     //弹出消息提示窗口
     MessageBox (hwnd, szBuffer, szAppName, MB_OK | MB_ICONEXCLAMATION ) ;
}

short AskAboutSave (HWND hwnd, TCHAR * szTitleName)
{
     TCHAR szBuffer[64 + MAX_PATH ] ;
     int   iReturn ;
   
     wsprintf (szBuffer, TEXT ("Save current changes in %s? "),
               szTitleName[0] ? szTitleName : UNTITLED ) ;
     //弹出提示消息,是否保存文件。返回用户选择
     iReturn = MessageBox (hwnd, szBuffer, szAppName,
                           MB_YESNOCANCEL | MB_ICONQUESTION ) ;
   
     if (iReturn == IDYES ) //如果用户选择的YES,就向父窗口发送保存消息
           //如果消息执行失败,根据程序设计,返回0,则将用户选择设为CANCEL
          if (!SendMessage (hwnd, WM_COMMAND , IDM_FILE_SAVE , 0))
               iReturn = IDCANCEL ;
          //返回用户选择
     return iReturn ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static BOOL           bNeedSave = FALSE ;
     static HINSTANCE  hInst ;
     static HWND          hwndEdit ;
     static int                iOffset ;
     static TCHAR         szFileName[MAX_PATH ], szTitleName[MAX_PATH ] ;
     static UINT            messageFindReplace ;
     int                         iSelBeg, iSelEnd, iEnable ;
     LPFINDREPLACE    pfr ;
   
     switch (message)
     {
     case WM_CREATE :
          //取得程序执行实例句柄
          hInst = ((LPCREATESTRUCT) lParam) -> hInstance ;
        
          //创建编辑控件的子窗口,ID为 EDITID
          hwndEdit = CreateWindow (TEXT ("edit "), NULL ,
                              WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
                              WS_BORDER | ES_LEFT | ES_MULTILINE |
                              ES_NOHIDESEL | ES_AUTOHSCROLL | ES_AUTOVSCROLL ,
                              0, 0, 0, 0, hwnd, (HMENU) EDITID , hInst, NULL ) ;

          //限制编辑控件最大只能输入32000个字符
          SendMessage (hwndEdit, EM_LIMITTEXT , 32000, 0L) ;
        
          PopFileInitialize (hwnd) ;           //初始化OPENFILENAME结构
          PopFontInitialize (hwndEdit) ;   //创建系统字体副本,运用到编辑控件中

          /*调用FindText函数前,必须调用该函数以得到FINDMSGSTRING信息的标识符,
            对话框函数在用户点击FindNext按钮或对话框被关闭时利用此标识符传送信息。
            FINDMSGSTRING信息的IParam参数包含一个指向FINDREPLACE结构的指针。*/

          messageFindReplace = RegisterWindowMessage (FINDMSGSTRING ) ;
        
          //向父窗口标题栏写入文字
          DoCaption (hwnd, szTitleName) ;
          return 0 ;
        
     case WM_SETFOCUS :
          //输入焦点移交到编辑控件上
          SetFocus (hwndEdit) ;
          return 0 ;
        
     case WM_SIZE :
          //设置编辑控件大小和位置
          MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE ) ;
          return 0 ;
        
     case WM_INITMENUPOPUP : //菜单准备弹出时,设置菜单项是否有效
          switch (lParam) //LOWORD (lParam):弹出式菜单索引(从0开始) ;HIWORD (lParam):系统菜单为1,其它为0
          {
          case 1:             // 编辑菜单
                //如果编辑控件能够执行Undo动作,那么SendMessage呼叫传回非零值。在这种情况下,选项被启用;否则,选项无效化
               EnableMenuItem ((HMENU) wParam, IDM_EDIT_UNDO ,           //撤销
                    SendMessage (hwndEdit, EM_CANUNDO , 0, 0L) ? MF_ENABLED : MF_GRAYED ) ;
             
                //IsClipboardFormatAvailable 判断剪贴板上的数据,如果是CF_TEXT,则该函数返回值为true,否则为false
                //剪贴板数据格式:CF_TEXT 以NULL结尾的ASCII字符的文本格式

               EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE ,          //粘贴
                    IsClipboardFormatAvailable (CF_TEXT ) ? MF_ENABLED : MF_GRAYED ) ;
             
               //向编辑控件发送EM_GETSEL消息,将得到目前选中的文字第一位和最后一位的超尾位置
               SendMessage (hwndEdit, EM_GETSEL , (WPARAM) &iSelBeg,
                                                 (LPARAM) &iSelEnd) ;

               //如果第一位不等于超尾位置则有效,否则无效
               iEnable = iSelBeg != iSelEnd ? MF_ENABLED : MF_GRAYED ;
             
               EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT ,   iEnable) ;
               EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY ,  iEnable) ;
               EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR , iEnable) ;
               break ;
             
          case 2:             // 搜索菜单
             
               //如果非模态对话框(查找、替换)
未激活 ,则有效,否则无效
               iEnable = hDlgModeless == NULL ?
                              MF_ENABLED : MF_GRAYED ;
             
               EnableMenuItem ((HMENU) wParam, IDM_SEARCH_FIND ,    iEnable) ;
               EnableMenuItem ((HMENU) wParam, IDM_SEARCH_NEXT ,    iEnable) ;
               EnableMenuItem ((HMENU) wParam, IDM_SEARCH_REPLACE , iEnable) ;
               break ;
          }
          return 0 ;
   
     case WM_COMMAND :
          // lParam:子窗口句柄;LOWORD (wParam):子窗口ID
          // 判断条件:句柄不为空,消息是由编辑控件发出 。菜单发出的该消息

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值