程序退出时的错误。
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "lizi.h"
HINSTANCE hInst;
HWND hWndMain;
HWND hWndRichEdit; //多格式文字编辑控件窗口句柄
CHAR szRtfFileName[MAX_PATH];
HCURSOR hCursorWait; //等待光标句柄
HCURSOR hCursorNORMAL; //正常光标句柄
HANDLE hRTFLib; //多格式文字编辑控件动态库句柄
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
hRTFLib=LoadLibrary("RICHED32.DLL"); //装入动态链接库
if(!InitApplication(hInstance))
return(FALSE);
if(!InitInstance(hInstance,nCmdShow))
return(FALSE);
hCursorWait=LoadCursor(NULL,IDC_WAIT); //装入等待光标
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return(msg.wParam);
}
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASSEX wcexStatusBar;
wcexStatusBar.cbSize=sizeof(WNDCLASSEX);
wcexStatusBar.style=0;
wcexStatusBar.lpfnWndProc=(WNDPROC)MainWndProc;
wcexStatusBar.cbClsExtra=0;
wcexStatusBar.cbWndExtra=0;
wcexStatusBar.hInstance=hInstance;
wcexStatusBar.hIcon=LoadIcon(hInstance,"RichEditIcon");
wcexStatusBar.hCursor=LoadCursor(NULL,IDC_ARROW);
wcexStatusBar.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wcexStatusBar.lpszMenuName="RichEditMenu";
wcexStatusBar.lpszClassName="RichEditWClass";
wcexStatusBar.hIconSm=LoadIcon(hInstance,"RichEditSmallIcon");
return(RegisterClassEx(&wcexStatusBar));
}
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hInst=hInstance;
hWnd=CreateWindow(
"RichEditWClass",
"剪贴板操作示范程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return(FALSE);
hWndMain=hWnd;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return(TRUE);
}
LRESULT APIENTRY MainWndProc(HWND hWnd,UINT message
,WPARAM wParam,LPARAM lParam)
{
static TCHAR szBuf[128];
static TCHAR szFontString[1024];
UINT uItem;
switch(message)
{
case WM_CREATE:
//创建多格式文字编辑控件子窗口
hWndRichEdit=CreateWindowEx(
WS_EX_CLIENTEDGE, //有一个客户型边界(凹形)
"RICHEDIT", //预定义的窗口类名称
NULL,
WS_CHILD|WS_VISIBLE|ES_MULTILINE|
ES_SAVESEL|WS_HSCROLL|WS_VSCROLL,//窗口风格
0,
0,
0,
0,
hWnd,
(HMENU)ID_RICHEDIT, //控件标识
hInst,
NULL
);
lstrcpy(szRtfFileName,"粘贴示例");
SetWindowText(hWnd,szRtfFileName);
break;
case WM_SIZE:
MoveWindow( //多格式文字编辑控件子窗口覆盖客户区
hWndRichEdit,
0,
0,
LOWORD(lParam),
HIWORD(lParam),
TRUE
);
break;
case WM_INITMENUPOPUP:
if((BOOL)HIWORD(lParam))
break; //如果是系统菜单,则不做检查。
if(SendMessage(hWndRichEdit,EM_CANUNDO,0,0)) EnableMenuItem(GetMenu(hWndMain),IDM_EDITUNDO
,MF_BYCOMMAND|MF_ENABLED); //"撤销"有效
else
EnableMenuItem(GetMenu(hWndMain),IDM_EDITUNDO
,MF_BYCOMMAND|MF_GRAYED); //"撤销"无效
if(SendMessage(hWndRichEdit,EM_CANPASTE,0,0)) EnableMenuItem(GetMenu(hWndMain),IDM_EDITPASTE
,MF_BYCOMMAND|MF_ENABLED); //"粘贴"有效
else
EnableMenuItem(GetMenu(hWndMain),IDM_EDITPASTE
,MF_BYCOMMAND|MF_GRAYED); //"粘贴"无效
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_EDITUNDO:
SendMessage(hWndRichEdit,WM_UNDO,0,0); //撤销
break;
case IDM_EDITCUT:
SendMessage(hWndRichEdit,WM_CUT,0,0); //剪切
break;
case IDM_EDITCOPY:
SendMessage(hWndRichEdit,WM_COPY,0,0); //复制
break;
case IDM_EDITPASTE:
SendMessage(hWndRichEdit,WM_PASTE,0,0);//粘贴
break;
case IDM_EDITDELETE:
SendMessage(hWndRichEdit,WM_CLEAR,0,0);//删除
break;
case IDM_EDITSELECTALL:
SendMessage(hWndRichEdit,EM_SETSEL,0,-1);//全选
break;
case IDM_EXIT:
SendMessage(hWnd,WM_CLOSE,0,0L);
return 0;
default:
return(DefWindowProc(hWnd,message,wParam,lParam));
}
break;
//此处若
//case WM_CLOSE:
//则没有问题
//若
case WM_DESTROY:
//则出现问题
if(hRTFLib) //如果装入了动态库
{
FreeLibrary((HMODULE)hRTFLib); //释放动态库
hRTFLib=NULL;
}
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,message,wParam,lParam));
}
return(0);
}
本例的头文件代码如下:
//"编辑"菜单
#define IDM_EDITUNDO 200
#define IDM_EDITCUT 201
#define IDM_EDITCOPY 202
#define IDM_EDITPASTE 203
#define IDM_EDITDELETE 204
#define IDM_EDITSELECTALL 205
#define IDM_EXIT 100
#define ID_RICHEDIT 1000
//函数原型说明
LRESULT APIENTRY MainWndProc(HWND,UINT
,WPARAM,LPARAM);
//其它函数
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
VOID UpdateCharFormatState(HWND,HWND);
本例的资源程序代码如下:
#include "windows.h"
#include "9_2.h"
RICHEDITMENU MENU DISCARDABLE
BEGIN
POPUP "编辑(&E)"
BEGIN
MENUITEM "剪切(&T)", IDM_EDITCUT
MENUITEM "复制(&C)", IDM_EDITCOPY
MENUITEM "粘贴(&P)", IDM_EDITPASTE
MENUITEM "删除(&D)", IDM_EDITDELETE
MENUITEM SEPARATOR
MENUITEM "撤销(&U)", IDM_EDITUNDO,GRAYED
MENUITEM SEPARATOR
MENUITEM "全部选定(&A)", IDM_EDITSELECTALL
MENUITEM SEPARATOR
MENUITEM "退出(&X)", IDM_EXIT
END
END