更新:
更換了ico.....
新增選擇字體和顏色的功能;
修正:
資源文件都已經打包到工程目錄里了,路徑也改成了相對路徑;
解決了保存100KB以上的文件會丟失數據的問題。
核心代碼: #include "resource.h" #include <windows.h> #include <stdio.h> #include <Richedit.h> #include <shlwapi.h> #pragma comment(lib,"shlwapi.lib") #define WM_FILENAME WM_USER+1//自定義消息,這個消息用來發送用戶選擇的文件全路徑 #define OPEN WM_USER+2//一個Flag,標識這個文件是在打開對話框里選擇的還是保存對話框 #define SAVE WM_USER+3 INT_PTR ExitCode1;//用來保存主對話框的退出代碼 INT_PTR ExitCode2;//About對話框的退出代碼 HINSTANCE hMain;//用來保存實例句柄 //主對話框過程函數聲明 INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); //About對話框過程函數聲明 INT_PTR CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL OnInitDialog(HWND hwndDlg);//相應WM_ONINITDIALOG消息時調用的函數 BOOL OnOpen(HWND hwndDlg,DWORD Flag);//當用戶點擊Open菜單項時調用 //void GetTitle(char *pSourceBuf,char *pDestBuf); void ChooseFont(HWND hwndDlg,CHOOSEFONT &font,LOGFONT &log); int WINAPI WinMain(HINSTANCE hIns,HINSTANCE hPrev,LPSTR lpCmd,int nShowCmd)//入口函數 { LoadLibrary("Riched20.dll");//要用Rich Edit控件就必須要先加載這個庫,否則程序無法運行 hMain=hIns; ExitCode1=DialogBox(hIns,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);//創建主對話框 return 0; } //主對話框過程函數 INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG://初始化 OnInitDialog(hwndDlg); break; //當用戶改變主對話框的大小時,Edit控件大小也應該改變。 case WM_SIZE: { RECT rect; ZeroMemory(&rect,sizeof(RECT)); GetWindowRect(hwndDlg,&rect);//獲取主對話框窗口的大小,詳見MSDN HWND hEdit=GetDlgItem(hwndDlg,IDC_TEXT); //改變Edit控件的大小 SetWindowPos(hEdit,HWND_TOP,0,0,rect.right-rect.left-5,rect.bottom-rect.top-50,SWP_SHOWWINDOW); CloseHandle(hEdit); } break; case WM_COMMAND: if(IDM_OPEN==wParam)//Open被用戶點擊 OnOpen(hwndDlg,OPEN); if(IDM_EXIT==wParam)//Exit被用戶點擊 SendMessage(hwndDlg,WM_CLOSE,NULL,NULL);//發送WM_CLOSE消息 if(IDM_ABOUT==wParam)//About被點擊,創建ABOUT對話框 ExitCode2=DialogBox(hMain,MAKEINTRESOURCE(IDD_ABOUT),hwndDlg,AboutProc); if(IDM_SAVE==wParam)//用戶點擊Save { OnOpen(hwndDlg,SAVE); } if(IDM_CLOSEFILE==wParam) { SetDlgItemText(hwndDlg,IDC_TEXT,""); SetWindowText(hwndDlg,"NotePadV2.0 By 小司"); } if(IDM_FORMAT==LOWORD(wParam)) { LOGFONT log; CHOOSEFONT font; CHARFORMAT2 cm; ZeroMemory(&cm,sizeof(cm)); ChooseFont(hwndDlg,font,log); if(ChooseFont(&font)) { strcpy(cm.szFaceName,log.lfFaceName); cm.cbSize=sizeof(cm); cm.dwMask=CFM_FACE | CFM_SIZE | CFM_WEIGHT | CFM_COLOR; cm.yHeight=log.lfHeight * log.lfHeight; cm.wWeight=log.lfWeight; cm.bPitchAndFamily=log.lfPitchAndFamily; cm.crTextColor=font.rgbColors; HWND hText=GetDlgItem(hwndDlg,IDC_TEXT); SendMessage(hText,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&cm); } } break; case WM_FILENAME://自定義的消息,用來接收文件路徑 if(OPEN==lParam) { //打開文件的目的是為了用GetFileSize函數獲取文件大小 HANDLE hFile=CreateFile((LPCSTR)wParam,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE==hFile) { MessageBox(hwndDlg,"Open File Failed!","Error",0); CloseHandle(hFile); break; } DWORD dwFileSize=GetFileSize(hFile,NULL);//獲取文件大小 CloseHandle(hFile); TCHAR *pszData=new TCHAR[dwFileSize]; memset(pszData,0,dwFileSize); FILE *fp=fopen((char*)wParam,"r");//wParam里保存了文件的路徑 fread(pszData,dwFileSize,1,fp); fclose(fp); SetDlgItemText(hwndDlg,IDC_TEXT,pszData);//顯示數據 } if(SAVE==lParam) { HWND hText=GetDlgItem(hwndDlg,IDC_TEXT); int len=GetWindowTextLength(hText); TCHAR *pBuf=new TCHAR[len]; memset(pBuf,0,len); GetDlgItemText(hwndDlg,IDC_TEXT,pBuf,len); char szFilePath[MAX_PATH+10]; sprintf_s(szFilePath,"%s.txt",(char*)wParam);//湊出來.txt FILE *fp=fopen(szFilePath,"w"); fwrite(pBuf,1,len,fp); fclose(fp); } break; //這個消息無用,調試用的.. case WM_LBUTTONDOWN: break; case WM_CLOSE: if(IDYES==MessageBox(hwndDlg,"Are you sure to exit?","Warming",MB_YESNO | MB_ICONWARNING)) { EndDialog(hwndDlg,ExitCode1); break; } break; default: break; } return FALSE; } //about窗口過程函數 INT_PTR CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_CLOSE: EndDialog(hwndDlg,ExitCode2); break; case WM_COMMAND: if(IDOK==wParam) { SendMessage(hwndDlg,WM_CLOSE,NULL,NULL); } break; default: break; } return FALSE; } BOOL OnInitDialog(HWND hwndDlg) { HICON hIcon=LoadIcon(hMain,MAKEINTRESOURCE(IDI_ICON1));//載入圖標 SendMessage(hwndDlg,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);//設置圖標 return TRUE; } BOOL OnOpen(HWND hwndDlg,DWORD Flag) { //見MSDN中關于GetOpenFileName的說明 TCHAR szFile[MAX_PATH]; TCHAR szFileTitle[MAX_PATH]; OPENFILENAME op; memset(szFile,0,MAX_PATH); memset(szFileTitle,0,MAX_PATH); ZeroMemory(&op,sizeof(op)); op.lStructSize=sizeof(op); op.hwndOwner=hwndDlg; op.lpstrFile=szFile; op.nMaxFile=MAX_PATH; op.lpstrFilter="All\0*.*\0文本文件(*.txt)\0*.txt\0"; op.nFilterIndex=2; op.lpstrFileTitle=NULL; op.nMaxFileTitle=0; op.lpstrInitialDir=NULL; op.Flags=OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT; if(OPEN==Flag) { if(GetOpenFileName(&op)) {//把文件的路徑發送給主對話框 StrCpy(szFileTitle,szFile); PathStripPath(szFileTitle); SetWindowText(hwndDlg,szFileTitle); SendMessage(hwndDlg,WM_FILENAME,(WPARAM)szFile,(LPARAM)Flag); } } if(SAVE==Flag) { if(GetSaveFileName(&op)) { SendMessage(hwndDlg,WM_FILENAME,(WPARAM)szFile,(LPARAM)Flag); } } return TRUE; } void ChooseFont(HWND hwndDlg,CHOOSEFONT &font,LOGFONT &log) { TCHAR szStyle[256]; HDC dc=GetDC(NULL); memset(szStyle,0,256); WORD wFontType=0; COLORREF color=RGB(0,0,0); ZeroMemory(&log,sizeof(log)); ZeroMemory(&font,sizeof(font)); font.lStructSize=sizeof(font); font.hwndOwner=hwndDlg; font.lpLogFont=&log; font.Flags=CF_EFFECTS | CF_FORCEFONTEXIST | CF_BOTH; font.rgbColors=color; font.lpszStyle=szStyle; font.hDC=dc; font.nFontType=wFontType; }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
