📄 建立窗口程序二.cpp
字号:
#include <windows.h>
#include <string.h>
#include "menutest.h"
#define FILE_LIST DDL_DIRECTORY|DDL_READWRITE
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam); //窗口函数声明
BOOL ShowFileInfo(HWND hWnd,HDC hDC,HDROP hDropInfo);
BOOL CALLBACK DlgProcGetFileName(HWND,UINT,WPARAM,LPARAM); //获取文件名
BOOL FileToEditBox(HWND,LPSTR); //文件到编辑框
BOOL EditBoxToFile(HWND,LPCTSTR); //编辑框到文件
BOOL EditBoxToClip1(HWND); //编辑框到剪贴板(复制)
BOOL EditBoxToClip2(HWND); //编辑框到剪贴板(剪切)
BOOL ClipToEditBox(HWND); //剪贴板到编辑框
bool check(char* , char* ); //判断两个字符串是否相等
HWND hWnd; //窗口句柄
HINSTANCE hInst; //应用程序实例句柄
HWND hList; //文件列表框句柄
HANDLE hFile; //文件句柄
HWND hWndEdit; //编辑框句柄
HWND hStatic; //状态栏句柄
OPENFILENAME ofn;
char szFile[255];
char szFileTitle[255];
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX wndclass;
MSG msg;
HACCEL hAccel; // 定义加速键句柄
// 为窗口类结构赋值
wndclass.cbSize = sizeof (wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance,"MYICON"); //设置程序的图标(不能缺少)
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = CreateSolidBrush(RGB(192,192,192));
wndclass.lpszMenuName = "Menu";
wndclass.lpszClassName = "TestWindowClass";
wndclass.hIconSm = LoadIcon(hInstance,"MYICON"); //设置程序的图标(不可缺少)
// 注册窗口类
if (!RegisterClassEx(&wndclass)) return 0;
// 用上面创建的类(即已经赋值的类)创建新窗口
hWnd = CreateWindowEx( //创建一个窗口并赋予窗口句柄hWnd
0, //扩展窗口风格,0 为默认
"TestWindowClass", //创建窗口所用的类(这是上面的类的名字)
//不同的类以名字来区分!!!
"记事本仿真程序^O^", //窗口的名称,(在标题栏)
WS_OVERLAPPEDWINDOW, //窗口风格为OVERLAPPED风格(和记事本一样的),
CW_USEDEFAULT, //这四个参数定义了窗口的位置和大小,现为默认
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, //父窗口句柄,这里没有,所以设为NULL
NULL, //菜单句柄,,,这里没有,,,为NULL
hInstance, //创建窗口的应用程序的当前句柄
NULL); //创建参数,用于给程序传递数据,程序没用到,,所以为空
if (!hWnd) return FALSE; //如果创建窗口失败,返回FALSE
hInst=hInstance;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
SendMessage(hWnd,WM_COMMAND,IDM_NEW,0L);
//加载加速键
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
while (GetMessage(&msg,NULL,0,0))
{
//在消息循环中截获加速键消息
if(!TranslateAccelerator(hWnd,hAccel,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return 0; // 如果没有特殊要求,这里也可以是0代表成功执行
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hDC;
RECT ClientRect;
LPCTSTR lpTemp=""; // 空字符串
char *p=NULL;
static bool flag=false; //若没有打开文件,flag=flase
static bool flag2=false; //若没有新建文件,flag2=false
static bool flag3=false; //用来判断文件名是否带了后缀,在 IDM_SAVE 中将会用到
static bool flag4=false; //用来判断是否保存了文件
switch (message)
{
case WM_CREATE:
GetClientRect(hwnd,&ClientRect); //获取客户区大小
hWndEdit=CreateWindow("EDIT", //创建编辑框
NULL,
WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|WS_BORDER,
ClientRect.left,
ClientRect.top,
ClientRect.right,
ClientRect.bottom,
hwnd,
(HMENU)ID_EDITCHILD,
hInst,
NULL);
EnableWindow(hWndEdit,0); //使编辑框不能接受输入
DragAcceptFiles( hwnd,TRUE ); //API函数:允许hWnd所指的窗口实现文件拖放
// 如果没有这个函数或设置为 FALSE
// 窗口都不能实现文件的拖放
return 0;
case WM_SIZE: //当窗口大小改变的时候,编辑框与状态栏跟着改变
MoveWindow(hWndEdit,0,0,LOWORD(lParam),HIWORD(lParam),true); //编辑框
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_OPEN:
SendMessage(hWndEdit,EM_SETSEL,0,-1); //选中所有文本
SendMessage(hWndEdit,EM_REPLACESEL,wParam,(DWORD)lpTemp); //用空串代码
EnableWindow(hWndEdit,0); //使编辑框不能接受输入
ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_FILEMUSTEXIST |OFN_PATHMUSTEXIST ;
ofn.lpstrFile=szFile;
ofn.nMaxFile=sizeof(szFile);
ofn.lpstrFileTitle=szFileTitle;
ofn.lpstrInitialDir=NULL;
ofn.nMaxFileTitle = NULL;
ofn.lpstrFilter="文本文件\0*.txt";
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner=hwnd; //父窗口句柄
//注:如果不指明父窗口句柄,当我们打开通用对话框
// 时将仍然可以对主窗口进行操作,这不是我们需要的
// 只有指明了父窗口句柄才能把焦点限定在通用对话框
if (GetOpenFileName(&ofn)==TRUE)
{
EnableWindow(hWndEdit,1); //使编辑框可以接受输入
FileToEditBox(hwnd,szFile); //文件到编辑框 !!!!!!!!!!!!
}
EnableWindow(hWndEdit,1); //使编辑框可以接受输入
flag=true; //打开了一个文件,flag=true
flag4=false; //打开了一个文件,还未保存,flag4=false
return 0;
case IDM_NEW:
//弹出文件名对话框
SendMessage(hWndEdit,EM_SETSEL,0,-1); //选中所有文本
SendMessage(hWndEdit,EM_REPLACESEL,wParam,(DWORD)lpTemp); //用空串代码
EnableWindow(hWndEdit,1); //允许编辑框输入
SetFocus(hWndEdit); //编辑框获得焦点
flag2=true; //新建了文件,flag2=true
flag4=false; //新建了文件,还未保存,flag4=false
return 0;
case IDM_CLOSE:
SendMessage(hWndEdit,EM_SETSEL,0,-1); //选中所有文本
SendMessage(hWndEdit,EM_REPLACESEL,wParam,(DWORD)lpTemp); //用空串代码
EnableWindow(hWndEdit,0); //禁止编辑框输入
flag=false;
flag2=false;
return 0;
case IDM_SAVE:
//将编辑框中所有内容输出到文件
if(flag==true || flag2==true)
{
if(flag4==false)
{
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER |OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT;
ofn.lpstrFile=szFile;
ofn.nMaxFile=sizeof(szFile);
ofn.lpstrFileTitle=szFileTitle;
ofn.lpstrInitialDir=NULL;
ofn.nMaxFileTitle = NULL;
ofn.lpstrFilter="文本文件\0*.txt";
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrTitle ="另存为...";
ofn.hwndOwner=hwnd; //父窗口句柄
EnableWindow(hWndEdit,0); //使编辑框不能接受输入
GetSaveFileName(&ofn);
EnableWindow(hWndEdit,1); //使编辑框可以接受输入
p=szFileTitle;
while(*p!='\0')
{
if(*p=='.') //字符串里有"."号,说明文件名带了后缀
{
flag3=true; //文件名带了后缀, flag3=true
if(check(p,".txt") || check(p,".TXT")) //如果后缀是".txt" 或 ".TXT"
break; //OK,跳出循环
else //如果后缀不是".txt" 或 ".TXT"
strcat(p,".txt"); //在其末尾加上".txt"
}
p++;
}
if(flag3==false)
{
strcat(p,".txt"); //文件名没有带后缀,我们给它加上后缀
}
}
EditBoxToFile(hwnd,szFileTitle);
flag4=true;
}
return 0;
case IDM_SAVEAS:
if(flag==true || flag2==true)
{
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER |OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT;
ofn.lpstrFile=szFile;
ofn.nMaxFile=sizeof(szFile);
ofn.lpstrFileTitle=szFileTitle;
ofn.lpstrInitialDir=NULL;
ofn.nMaxFileTitle = NULL;
ofn.lpstrFilter="文本文件\0*.txt";
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrTitle ="另存为...";
ofn.hwndOwner=hwnd; //父窗口句柄
EnableWindow(hWndEdit,0); //使编辑框不能接受输入
GetSaveFileName(&ofn);
EnableWindow(hWndEdit,1); //使编辑框可以接受输入
p=szFileTitle;
while(*p!='\0')
{
if(*p=='.') //字符串里有"."号,说明文件名带了后缀
{
flag=true; //设置flag=false;
if(check(p,".txt") || check(p,".TXT")) //如果后缀是".txt" 或 ".TXT"
break; //OK,返回
else //如果后缀不是".txt" 或 ".TXT"
strcat(p,".txt"); //在其末尾加上".txt"
}
else //若字符串里没有"."号,说明文件名没有带后缀
flag=false; //设置flag=false;
p++;
}
if(flag==false) //若flag=false,说明文件名没有带后缀
{
strcat(szFileTitle,".txt"); //给文件名加上后缀".txt"
flag=true;
}
if(flag==true)
{
EditBoxToFile(hwnd,szFileTitle);
flag4=true;
}
}
return 0;
case IDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
return 0;
case IDM_COPY:
EditBoxToClip1(hwnd);
return 0;
case IDM_CUT:
EditBoxToClip2(hwnd);
return 0;
case IDM_PASTE:
ClipToEditBox(hwnd);
return 0;
case IDM_ABOUT:
MessageBox(hwnd,TEXT("记事本仿真程序(V1.0)\n\n广西工学院计023:黄伟林\nQQ: 362176730\n最后更新: 2005-1-19"),TEXT("记事本仿真程序(V1.0)"),MB_OK|MB_ICONINFORMATION);
return 0;
}
return 0;
case WM_DROPFILES: //当有文件被拖入窗口并放下时激发此消息
HDROP hDropInfo; //HDROP句柄,用以存放拖入文件的信息
hDropInfo = ( HDROP )wParam; //初始化 hDropInfo(不进行初始化运行会出错)
hDC = GetDC( hwnd );
ShowFileInfo( hwnd,hDC,hDropInfo );
DragFinish( hDropInfo );
ReleaseDC( hwnd,hDC );
flag=true; //打开了一个文件,flag=true
flag4=false; //打开了一个文件,还未保存,flag4=false
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hList); //消毁文件列表框
return 0;
}
return 0;
case WM_CLOSE: // 窗口关闭前的消息(比如用户点了关闭按钮)
DWORD dwFileSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -