怎么获取用户在编辑框中输入的文字,甚至改变这些文字。
4.窗口消息
WM_GETTEXTLENGTH--获取文本长度(不包括\0)
wParam=0
lParam=0
通过SendMessage返回文本的长度。
GetWindowTextLength()获取窗口文字的长度。根据长度获取足够的内存,动态分配。
WM_GETTEXT--获取控件文本的内容
wParam--缓冲区的长度(含结尾字符)
lParam--缓冲区指针
等价函数:
GetWindowText()
WM_SETTEXT--设置控件文本的内容
wParam--0
lParam--缓冲区指针(所指向的文本内容必须以\0结束)
以上几个可以通用,以下都只限于编辑框。
EM_LIMITTEXT--设置编辑框最大容纳多少字符
wParam--最大字符数
lParam--0
WM_UNDO----恢复,撤消上一次操作
wParam--0
lParam--0
WM_CUT--剪切
wParam--0
lParam--0
WM_COPY--复制
lParam--0
wParam--0
WM_PASTE------粘贴
wParam--0
lParam--0
WM_CLEAR--删除
wParam-0
lParam-0
EM_SETSEL------设置选取范围
wParam--选取区的起始字符索引号
lParam--选取区的终止字符索引号
WM_GETFONT---获取字体,通过SendMessage返回字体句柄
wParam-0
lParam-0
WM_SETFONT--设置字体
wParam-字体句柄
lParam--是否立即重绘 MAKELPARAM(TRUE/FALSE,0)
5.通知消息
EN_ERRSPACE---分配内存失败
EN_MAXTEXT----字符数超过上限
EN_UPDATE--文本内容发生变化,在变化更新显示之前
EN_CHANGE--文本内容发生变化,在文本发生变化并且更新显示之后
工程WinMemo
#include<stdlib.h>
#define IDC_EDIT_MEMO 4001
1.插入一个菜单IDR_MENU_MAIN,模仿记事本的菜单做。把菜单加入到窗口类中。
wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MENU_MAIN);
主消息处理函数中
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_FILE_SAVE:
int nLen=SendMessage(hwndEdit,WM_GETTEXTLENGTH,0,0);
LPSTR pszMemo=(LPSTR)malloc((nLen+1)*sizeof(CHAR));
if(!pszMemo)
MessageBox(hWnd,"内存分配失败",g_pszAppName,MB_OK|MB_ICONERROR);
else{
SendMessage(hwndEdit,WM_GETTEXT,nLen+1,(LPARAM)pszMemo);
//把内容写到文件当中
WriteMemo(hWnd,pszMemo);
free(pszMemo);
}
return 0;
case IDM_FILE_EXIT:
PostMessage(hWnd,WM_CLOSE,0,0);
return 0;
case IDM_EDIT_UNTO:
SendMessage(hwndEdit,WM_UNDO,0,0);
return 0;
case IDM_EDIT_CUT:
SendMessage(hwndEdit,WM_CUT,0,0);
return 0;
case IDM_EDIT_COPY:
SendMessage(hwndEdit,WM_COPY,0,0);
return 0;
case IDM_EDIT_PASTE:
SendMessage(hwndEdit,WM_PASTE,0,0);
return 0;
case IDM_IDM_EDIT_DELETE:
SendMessage(hwndEdit,WM_CLEAR,0,0);
return 0;
case IDM_EDIT_SELECT_ALL:
SendMessage(hwndEdit,EM_SETSEL,0,-1);
return 0;
case IDM_VIEW_COLOR:
以前有程序做过,可直接复制粘贴过来 。
if(SelectColor(hWnd,&crBack)){
if(hbrushBack)
DeleteObject(hbrushBack);
hbrushBack=CreateSolidBrush(crBack);
InavalidateRect(hwndEdit,NULL,TRUE);
}
return 0;
case IDM_VIEW_FONT:
HFONT hFont=(HFONT)SendMessage(hwndEdit,WM_GETFONT,0,0);
LOGFONT lf;
//当没有设置过任何字体,返回空句柄
if(hFont)
GetObject(hFont,sizeof(lf),&lf);
else
GetObject(GetStockObject(SYSTEM_FONT),sizeof(lf),&lf);
static COLORREF crText;
crText=GetSyscolor(COLOR_WINDOWTEXT);
if(SelectFont(hWnd,&lf,&crText))
SelectFont(hwndEdit,WM_SETFONT,(WPARAM)CreateFontIndirect(&lf),MAKELPARAM(TRUE,0));
if(hFont)
DeleteObject(hFont);
}
return 0;
}
break;
//对菜单初始化操作
case WM_INITMENUPOPUP:{
//撤销
EnableMenuItem((HMENU)wParam,IDM_EDIT_UNDO,(SendMessage(hwndEdit,EM_CANUNDO,0,0)?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND);
//粘贴
EnableMenuItem((HMENU)wParam,IDM_EDIT_PASTE,(ISClipboardFormatAvailable(CF_TEXT)?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND);
//是否有选区
UINT uSelect=SendMessage(hwndEdit,EM_GETSEL,0,0);
if(LOWORD(uSelect)==HIWORD(uSelect)){
//将复制,删除,剪切变灰
}
}
static HWND hwndEdit=NULL;
case WM_CREATE:
//编辑框大小在WM_SIZE消息中调
LPSTR pszMemo=ReadMemo(hWnd);
if(!pszMemo)
return -1;
hwndEdit=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",pszMemo,WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_MULTILINE,0,0,0,0,hWnd,(HMENU)IDC_EDIT_MEMO,g_hInstance,NULL);
free(pszMemo);
break;
//当编辑框需要绘制的时候,目的改变颜色
case WM_CTLCOLOREDIT:
SetTextColor((HDC)wParam,crText);
SetBkColor((HDC)wParam,crBack);
//return 0这个很重要。否则会调用默认处理函数,起不到改变颜色的作用。
return 0;
case WM_SIZE:
MoveWindow(hwndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
break;
//给窗口使用空白刷子,使其不闪。而不使用默认的白色刷子。
wcex.hbrBackground=(HBRUSH)
GetStockObject(HOLLOW_BRUSH);
//当一打开让焦点付给EDIT
case WM_SETFOCUS:
SetFocus(hwndEdit);
return 0;
LPCSTR g_pszMemoFile="WinMemo.dat";
//写文件函数
BOOL WriteMemo(HWND hWnd,LPCTSTR pszMemo){
FILE * fp=fopen(g_pszMemoFile,"wb");
if(!fp){
MessageBox(hWnd,"打开文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
return FALSE;
}
if(fwrite(pszMemo,1,strlen(pszMemo)*sizeof(CHAR),fp)!=strlen(pszMemo)*sizeof(CHAR)){
MessageBox(hWnd,"写入文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
fclose(fp);
return FALSE;
}
fclose(fp);
return TRUE;
}
//读文件
LPSTR ReadMemo(HWND hWnd){
FILE *fp=fopen(g_pszMemoFile,"a+b");
if(!fp){
MessageBox(hWnd,"打开文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
return FALSE;
}
fseek(fp,0,SEEK_END);
size_t len=ftell(fp);
fseek(fp,0,SEEK_SET);
LPSTR pszMemo=(LPSTR)malloc(len+sizeof(CHAR));
if(!pszMemo){
MessageBox(hWnd,"内存分配失败",g_pszAppName,MB_OK|MB_ICONERROR);
fclose(fp);
return FALSE;
}
//把缓冲区清理成0
ZeroMemory(pszMemo,len+sizeof(CHAR));
if(fread(pszMemo,1,len,fp)!=len){
MessageBox(hWnd,"读取文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
free(pszMemo);
fclose(fp);
return FALSE;
}
fclose(fp);
return pszMemo;
}
}
选择字体函数
BOOL SelectFont(HWND hWnd,LOGFONT*pFont,COLORREF* pColor){
LOGFONT lf=*pFont;
CHOOSEFONT cf;
cf.lStructSize=sizeof(cf);
cf.hwndOwner=hWnd;
cf.hDC=NULL;
cf.lpLogFont=&lf;
cf.iPointSize=0;
cf.Flags=CF_INITOLOGFONTSTRUCT|CF_SCREENFONTS|CF_EFFECTS;
cf.rgbColors=*pColor;
cf.lCustData=0;
cf.lpfnHook=NULL;
cf.lpTemplateName=NULL;
cf.hInstance=NULL;
cf.nFontType=0;
cf.nSizeMin=0;
cf.nSizeMax=0;
if(ChooseFont(&cf)){
*pFont=cf.lpLogFont;
*pColor=cf.rgbColors;
return TRUE;
}
return FALSE;
//公用对话框声明部分
#include<commdlg.h>
}
最后询问是否保存,只有当用户修改了内容后才给这个提示。
//在窗口处理函数中增加一个标志位
static BOOL bDirty=FALSE;
//菜单初始化后保存的更改
case WM_INITMENUPOPUP:
EnableMenuItem((HMENU)wParam,IDM_FILE_SAVE,(bDirty?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND));
//写完后把脏标志清了在WritheMemo后
bDirty=FALSE;
//脏标志改为TRUE
case IDC_EDIT_MEMO:
switch(HIWORD(wParam)){
case EN_UPDATE:
bDirty=TRUE;
return 0;
}
break;
case WM_CLOSE:{
if(bDirty){
int nItem=MessageBox(hWnd,"文件的文字已经改变\n\n想保存文件不?",g_pszAppName,MB_YESNOCANCEL|MB_ICONQUESTIoN);
if(nItem==IDYES)
SendMessage(hWnd,WM_COMMAND,IDM_FILE_SAVE,0);
else
if(nItem==IDCCANCEL)
return 0;
}
break;
}
4.窗口消息
WM_GETTEXTLENGTH--获取文本长度(不包括\0)
wParam=0
lParam=0
通过SendMessage返回文本的长度。
GetWindowTextLength()获取窗口文字的长度。根据长度获取足够的内存,动态分配。
WM_GETTEXT--获取控件文本的内容
wParam--缓冲区的长度(含结尾字符)
lParam--缓冲区指针
等价函数:
GetWindowText()
WM_SETTEXT--设置控件文本的内容
wParam--0
lParam--缓冲区指针(所指向的文本内容必须以\0结束)
以上几个可以通用,以下都只限于编辑框。
EM_LIMITTEXT--设置编辑框最大容纳多少字符
wParam--最大字符数
lParam--0
WM_UNDO----恢复,撤消上一次操作
wParam--0
lParam--0
WM_CUT--剪切
wParam--0
lParam--0
WM_COPY--复制
lParam--0
wParam--0
WM_PASTE------粘贴
wParam--0
lParam--0
WM_CLEAR--删除
wParam-0
lParam-0
EM_SETSEL------设置选取范围
wParam--选取区的起始字符索引号
lParam--选取区的终止字符索引号
WM_GETFONT---获取字体,通过SendMessage返回字体句柄
wParam-0
lParam-0
WM_SETFONT--设置字体
wParam-字体句柄
lParam--是否立即重绘 MAKELPARAM(TRUE/FALSE,0)
5.通知消息
EN_ERRSPACE---分配内存失败
EN_MAXTEXT----字符数超过上限
EN_UPDATE--文本内容发生变化,在变化更新显示之前
EN_CHANGE--文本内容发生变化,在文本发生变化并且更新显示之后
工程WinMemo
#include<stdlib.h>
#define IDC_EDIT_MEMO 4001
1.插入一个菜单IDR_MENU_MAIN,模仿记事本的菜单做。把菜单加入到窗口类中。
wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MENU_MAIN);
主消息处理函数中
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_FILE_SAVE:
int nLen=SendMessage(hwndEdit,WM_GETTEXTLENGTH,0,0);
LPSTR pszMemo=(LPSTR)malloc((nLen+1)*sizeof(CHAR));
if(!pszMemo)
MessageBox(hWnd,"内存分配失败",g_pszAppName,MB_OK|MB_ICONERROR);
else{
SendMessage(hwndEdit,WM_GETTEXT,nLen+1,(LPARAM)pszMemo);
//把内容写到文件当中
WriteMemo(hWnd,pszMemo);
free(pszMemo);
}
return 0;
case IDM_FILE_EXIT:
PostMessage(hWnd,WM_CLOSE,0,0);
return 0;
case IDM_EDIT_UNTO:
SendMessage(hwndEdit,WM_UNDO,0,0);
return 0;
case IDM_EDIT_CUT:
SendMessage(hwndEdit,WM_CUT,0,0);
return 0;
case IDM_EDIT_COPY:
SendMessage(hwndEdit,WM_COPY,0,0);
return 0;
case IDM_EDIT_PASTE:
SendMessage(hwndEdit,WM_PASTE,0,0);
return 0;
case IDM_IDM_EDIT_DELETE:
SendMessage(hwndEdit,WM_CLEAR,0,0);
return 0;
case IDM_EDIT_SELECT_ALL:
SendMessage(hwndEdit,EM_SETSEL,0,-1);
return 0;
case IDM_VIEW_COLOR:
以前有程序做过,可直接复制粘贴过来 。
if(SelectColor(hWnd,&crBack)){
if(hbrushBack)
DeleteObject(hbrushBack);
hbrushBack=CreateSolidBrush(crBack);
InavalidateRect(hwndEdit,NULL,TRUE);
}
return 0;
case IDM_VIEW_FONT:
HFONT hFont=(HFONT)SendMessage(hwndEdit,WM_GETFONT,0,0);
LOGFONT lf;
//当没有设置过任何字体,返回空句柄
if(hFont)
GetObject(hFont,sizeof(lf),&lf);
else
GetObject(GetStockObject(SYSTEM_FONT),sizeof(lf),&lf);
static COLORREF crText;
crText=GetSyscolor(COLOR_WINDOWTEXT);
if(SelectFont(hWnd,&lf,&crText))
SelectFont(hwndEdit,WM_SETFONT,(WPARAM)CreateFontIndirect(&lf),MAKELPARAM(TRUE,0));
if(hFont)
DeleteObject(hFont);
}
return 0;
}
break;
//对菜单初始化操作
case WM_INITMENUPOPUP:{
//撤销
EnableMenuItem((HMENU)wParam,IDM_EDIT_UNDO,(SendMessage(hwndEdit,EM_CANUNDO,0,0)?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND);
//粘贴
EnableMenuItem((HMENU)wParam,IDM_EDIT_PASTE,(ISClipboardFormatAvailable(CF_TEXT)?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND);
//是否有选区
UINT uSelect=SendMessage(hwndEdit,EM_GETSEL,0,0);
if(LOWORD(uSelect)==HIWORD(uSelect)){
//将复制,删除,剪切变灰
}
}
static HWND hwndEdit=NULL;
case WM_CREATE:
//编辑框大小在WM_SIZE消息中调
LPSTR pszMemo=ReadMemo(hWnd);
if(!pszMemo)
return -1;
hwndEdit=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",pszMemo,WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_MULTILINE,0,0,0,0,hWnd,(HMENU)IDC_EDIT_MEMO,g_hInstance,NULL);
free(pszMemo);
break;
//当编辑框需要绘制的时候,目的改变颜色
case WM_CTLCOLOREDIT:
SetTextColor((HDC)wParam,crText);
SetBkColor((HDC)wParam,crBack);
//return 0这个很重要。否则会调用默认处理函数,起不到改变颜色的作用。
return 0;
case WM_SIZE:
MoveWindow(hwndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
break;
//给窗口使用空白刷子,使其不闪。而不使用默认的白色刷子。
wcex.hbrBackground=(HBRUSH)
GetStockObject(HOLLOW_BRUSH);
//当一打开让焦点付给EDIT
case WM_SETFOCUS:
SetFocus(hwndEdit);
return 0;
LPCSTR g_pszMemoFile="WinMemo.dat";
//写文件函数
BOOL WriteMemo(HWND hWnd,LPCTSTR pszMemo){
FILE * fp=fopen(g_pszMemoFile,"wb");
if(!fp){
MessageBox(hWnd,"打开文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
return FALSE;
}
if(fwrite(pszMemo,1,strlen(pszMemo)*sizeof(CHAR),fp)!=strlen(pszMemo)*sizeof(CHAR)){
MessageBox(hWnd,"写入文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
fclose(fp);
return FALSE;
}
fclose(fp);
return TRUE;
}
//读文件
LPSTR ReadMemo(HWND hWnd){
FILE *fp=fopen(g_pszMemoFile,"a+b");
if(!fp){
MessageBox(hWnd,"打开文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
return FALSE;
}
fseek(fp,0,SEEK_END);
size_t len=ftell(fp);
fseek(fp,0,SEEK_SET);
LPSTR pszMemo=(LPSTR)malloc(len+sizeof(CHAR));
if(!pszMemo){
MessageBox(hWnd,"内存分配失败",g_pszAppName,MB_OK|MB_ICONERROR);
fclose(fp);
return FALSE;
}
//把缓冲区清理成0
ZeroMemory(pszMemo,len+sizeof(CHAR));
if(fread(pszMemo,1,len,fp)!=len){
MessageBox(hWnd,"读取文件失败",g_pszAppName,MB_OK|MB_ICONERROR);
free(pszMemo);
fclose(fp);
return FALSE;
}
fclose(fp);
return pszMemo;
}
}
选择字体函数
BOOL SelectFont(HWND hWnd,LOGFONT*pFont,COLORREF* pColor){
LOGFONT lf=*pFont;
CHOOSEFONT cf;
cf.lStructSize=sizeof(cf);
cf.hwndOwner=hWnd;
cf.hDC=NULL;
cf.lpLogFont=&lf;
cf.iPointSize=0;
cf.Flags=CF_INITOLOGFONTSTRUCT|CF_SCREENFONTS|CF_EFFECTS;
cf.rgbColors=*pColor;
cf.lCustData=0;
cf.lpfnHook=NULL;
cf.lpTemplateName=NULL;
cf.hInstance=NULL;
cf.nFontType=0;
cf.nSizeMin=0;
cf.nSizeMax=0;
if(ChooseFont(&cf)){
*pFont=cf.lpLogFont;
*pColor=cf.rgbColors;
return TRUE;
}
return FALSE;
//公用对话框声明部分
#include<commdlg.h>
}
最后询问是否保存,只有当用户修改了内容后才给这个提示。
//在窗口处理函数中增加一个标志位
static BOOL bDirty=FALSE;
//菜单初始化后保存的更改
case WM_INITMENUPOPUP:
EnableMenuItem((HMENU)wParam,IDM_FILE_SAVE,(bDirty?MF_ENABLED:MF_GRAYED)|MF_BYCOMMAND));
//写完后把脏标志清了在WritheMemo后
bDirty=FALSE;
//脏标志改为TRUE
case IDC_EDIT_MEMO:
switch(HIWORD(wParam)){
case EN_UPDATE:
bDirty=TRUE;
return 0;
}
break;
case WM_CLOSE:{
if(bDirty){
int nItem=MessageBox(hWnd,"文件的文字已经改变\n\n想保存文件不?",g_pszAppName,MB_YESNOCANCEL|MB_ICONQUESTIoN);
if(nItem==IDYES)
SendMessage(hWnd,WM_COMMAND,IDM_FILE_SAVE,0);
else
if(nItem==IDCCANCEL)
return 0;
}
break;
}