更新:
更換了ico.....
新增選擇字體和顏色的功能;
修正:
資源文件都已經(jīng)打包到工程目錄里了,路徑也改成了相對(duì)路徑;
解決了保存100KB以上的文件會(huì)丟失數(shù)據(jù)的問題。
核心代碼: #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//自定義消息,這個(gè)消息用來發(fā)送用戶選擇的文件全路徑 #define OPEN WM_USER+2//一個(gè)Flag,標(biāo)識(shí)這個(gè)文件是在打開對(duì)話框里選擇的還是保存對(duì)話框 #define SAVE WM_USER+3 INT_PTR ExitCode1;//用來保存主對(duì)話框的退出代碼 INT_PTR ExitCode2;//About對(duì)話框的退出代碼 HINSTANCE hMain;//用來保存實(shí)例句柄 //主對(duì)話框過程函數(shù)聲明 INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); //About對(duì)話框過程函數(shù)聲明 INT_PTR CALLBACK AboutProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL OnInitDialog(HWND hwndDlg);//相應(yīng)WM_ONINITDIALOG消息時(shí)調(diào)用的函數(shù) BOOL OnOpen(HWND hwndDlg,DWORD Flag);//當(dāng)用戶點(diǎn)擊Open菜單項(xiàng)時(shí)調(diào)用 //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)//入口函數(shù) { LoadLibrary("Riched20.dll");//要用Rich Edit控件就必須要先加載這個(gè)庫,否則程序無法運(yùn)行 hMain=hIns; ExitCode1=DialogBox(hIns,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);//創(chuàng)建主對(duì)話框 return 0; } //主對(duì)話框過程函數(shù) INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG://初始化 OnInitDialog(hwndDlg); break; //當(dāng)用戶改變主對(duì)話框的大小時(shí),Edit控件大小也應(yīng)該改變。 case WM_SIZE: { RECT rect; ZeroMemory(&rect,sizeof(RECT)); GetWindowRect(hwndDlg,&rect);//獲取主對(duì)話框窗口的大小,詳見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被用戶點(diǎn)擊 OnOpen(hwndDlg,OPEN); if(IDM_EXIT==wParam)//Exit被用戶點(diǎn)擊 SendMessage(hwndDlg,WM_CLOSE,NULL,NULL);//發(fā)送WM_CLOSE消息 if(IDM_ABOUT==wParam)//About被點(diǎn)擊,創(chuàng)建ABOUT對(duì)話框 ExitCode2=DialogBox(hMain,MAKEINTRESOURCE(IDD_ABOUT),hwndDlg,AboutProc); if(IDM_SAVE==wParam)//用戶點(diǎn)擊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函數(shù)獲取文件大小 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);//顯示數(shù)據(jù) } 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; //這個(gè)消息無用,調(diào)試用的.. 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窗口過程函數(shù) 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));//載入圖標(biāo) SendMessage(hwndDlg,WM_SETICON,ICON_SMALL,(LPARAM)hIcon);//設(shè)置圖標(biāo) return TRUE; } BOOL OnOpen(HWND hwndDlg,DWORD Flag) { //見MSDN中關(guān)于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)) {//把文件的路徑發(fā)送給主對(duì)話框 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; }
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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