/*---------------------------------------
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
// 判断条件:句柄不为空,消息是由编辑控件发出 。菜单发出的该消息
windows程序设计 「PopPad3」范例分析笔记
最新推荐文章于 2021-05-16 03:23:55 发布
本文档是PopPad3编辑器的源码分析笔记,详细讲解了程序的主要功能模块,包括文件操作、查找替换、字体设置和打印功能的实现。通过源码分析,有助于理解Windows程序设计原理。
摘要由CSDN通过智能技术生成