⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 建立窗口程序二.cpp

📁 windows环境下用VC6.0。用C语言在sdk平台下 生成的简单记事本程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -