sunstars
Newbie | Ðåäàêòèðîâàòü | Ïðîôèëü | Ñîîáùåíèå | Öèòèðîâàòü | Ñîîáùèòü ìîäåðàòîðó ReachEdit çàêðûâàåò ïàíåëü èíñòðóìåíòîâ. ïðè íàâåäåíèè êóðñîðà ìûøè íà ïðåäïîëàãàåìîå ìåñòî ðàñïîëîæåíèÿ êíîïêè ïàíåëè èíñòðóìåíòîâ è íàæàòèÿ êíîïêè ìûøè ïîÿâëÿåòñÿ êíîïêà ìàíåëè èíñòðóìåíòîâ è ïðîèñõîäèò áëàãîïîëó÷íî îáðàáîòêà ñîáûòèÿ. Êàê ñäåëàòü òàê, ÷òîáû ReachEdit íå çàêðûâàë ïàíåëü èíñòðóìåíòîâ? Èíèöèàëèçàöèÿ ïàíåëè èíñòðóìåíòîâ è Reach Edit â HWND InitToolBar(HWND hWnd) è BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) âëîæåíîãî èñõîäíèêà íà Ñ++ Êîä: #include <windows.h> #include <windowsx.h> #include <memory.h> #include <richedit.h> #include <CommCtrl.h> #include "resource.h" #include "afxres.h" #include "ReachEdit.h" #define ID_TOOLBAR 201 #define NUM_BUTTONS 8 #define SEPARATOR_WIDTH 10 char szAppName[] = "RtfEditApp"; char szAppTitle[] = "Rich Text Editor RtfPad"; HWND hwndEdit; HWND hwndToolBar; HINSTANCE hInst; HINSTANCE hRTFLib; LPTOOLTIPTEXT lpTTT; // ----------------------------------------------------- // Ôóíêöèÿ WinMain // ----------------------------------------------------- int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg; hInst = hInstance; // Ïðåâåðÿåì, íå áûëî ëè ýòî ïðèëîæåíèå çàïóùåíî ðàíåå hWnd = FindWindow(szAppName, NULL); if(hWnd) { if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); return FALSE; } // Çàãðóæàåì áèáëèîòåêó RICHED32.DLL hRTFLib = LoadLibrary("RICHED32.DLL"); if(!hRTFLib) return FALSE; // Ðåãèñòðèðóåì êëàññ îêíà memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.hIconSm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICONSM), IMAGE_ICON, 16, 16, 0); wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_APPICON)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName; if(!RegisterClassEx(&wc)) if(!RegisterClass((LPWNDCLASS)&wc.style)) return FALSE; // Ñîçäàåì ãëàâíîå îêíî ïðèëîæåíèÿ hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(!hWnd) return(FALSE); // Èíèöèàëèçàöèÿ áèáëèîòåêè "Common Control Library" INITCOMMONCONTROLSEX icc;// ñòðóêòóðà, ñîäåðæàùàÿ èíôîðìàöèþ î òîì, êàêèå êëàññû ýëåìåíòîâ óïðàâëåíèÿ äîëæíû áûòü çàðåãåñòðèðîâàíû icc.dwSize = sizeof(INITCOMMONCONTROLSEX); icc.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&icc);//ðåãèñòðèðóåò îêîííûå êëàññû ýëåìåíòîâ óïðàâëåíèÿ // Îòîáðàæàåì îêíî è çàïóñêàåì öèêë îáðàáîòêè ñîîáùåíèé ShowWindow(hWnd, nCmdShow); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } // ----------------------------------------------------- // Ôóíêöèÿ WndProc // ----------------------------------------------------- LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd, WM_CREATE, WndProc_OnCreate); HANDLE_MSG(hWnd, WM_DESTROY, WndProc_OnDestroy); HANDLE_MSG(hWnd, WM_COMMAND, WndProc_OnCommand); HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnSize); HANDLE_MSG(hWnd, WM_SETFOCUS, WndProc_OnSetFocus); case WM_NOTIFY: lpTTT = (LPTOOLTIPTEXT)lParam; if (lpTTT->hdr.code == TTN_NEEDTEXT) { lpTTT->hinst = GetModuleHandle(NULL); lpTTT->lpszText = MAKEINTRESOURCE(lpTTT->hdr.idFrom); } break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } } HWND InitToolBar(HWND hWnd) { HWND hToolBar; int btnID[NUM_BUTTONS] = { ID_FILE_NEW, ID_FILE_OPEN, ID_FILE_SAVEAS, ID_EDIT_CUT, ID_EDIT_COPY, ID_EDIT_PASTE, ID_FILE_PRINT, ID_HELP_ABOUT }; int btnStyle[NUM_BUTTONS] = { TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON, TBSTYLE_BUTTON }; TBBUTTON tbb[NUM_BUTTONS];//ñòðóêòóðà, ñîäåðæàùàÿ èíôîðìàöèþ î äîáàâëåííûõ êíîïêàõ memset(tbb, 0, sizeof(tbb)); for (int i = 0; i < NUM_BUTTONS; ++i) { tbb[i].iBitmap = i; tbb[i].idCommand = btnID[i]; tbb[i].fsState = TBSTATE_ENABLED; tbb[i].fsStyle = btnStyle[i]; } hToolBar = CreateToolbarEx(hWnd, WS_CHILD | WS_VISIBLE | WS_BORDER | TBSTYLE_TOOLTIPS, ID_TOOLBAR, NUM_BUTTONS, GetModuleHandle(NULL), IDR_TOOLBAR1, tbb, NUM_BUTTONS, 17, 15, 0, 0, sizeof(TBBUTTON));//ñîçäà¸ò Toolbar è äîáàâëÿåò îïðåäåë¸ííûå êíîïêè íà Toolbar return hToolBar; } // ----------------------------------------------------- // Ôóíêöèÿ WndProc_OnCreate // ----------------------------------------------------- BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { RECT rc; RECT rcTB; // ïîçèöèÿ è ðàçìåðû îêíà hwndToolBar int tbHeight; // âûñîòà îêíà hwndToolBar // Ñîçäàíèå ïàíåëè èíñòðóìåíòîâ hwndToolBar = InitToolBar(hWnd); SendMessage(hwndToolBar, TB_AUTOSIZE, 0, 0); // Îïðåäåëÿåì ðàçìåðû âíóòðåííåé îáëàñòè ãëàâíîãî îêíà GetClientRect(hWnd, &rc); // Ó÷èòûâàåì óìåíüøåíèå êëèåíòñêîé îáëàñòè èç-çà ðàçìåùåíèÿ ïàíåëè èíñòðóìåíòîâ GetWindowRect(hwndToolBar, &rcTB); tbHeight = rcTB.bottom - rcTB.top; // Ñîçäàåì îðãàí óïðàâëåíèÿ Rich Edit hwndEdit = CreateWindowEx(0L, "RICHEDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL |ES_NOHIDESEL | ES_AUTOVSCROLL | ES_MULTILINE | ES_SAVESEL | ES_SUNKEN, 0, tbHeight, rc.right - rc.left, rc.bottom - rc.top-tbHeight, hWnd, (HMENU) IDC_RTFEDIT, hInst, NULL); if(hwndEdit == NULL) return FALSE; // Ïåðåäàåì ôîêóñ ââîäà îðãàíó óïðàâëåíèÿ Rich Edit SetFocus(hwndEdit); return TRUE; } // ----------------------------------------------------- // Ôóíêöèÿ WndProc_OnDestroy // ----------------------------------------------------- #pragma warning(disable: 4098) long WndProc_OnDestroy(HWND hWnd) { // Óíè÷òîæàåì îðãàí óïðàâëåíèÿ Rich Edit if(hwndEdit) DestroyWindow(hwndEdit); // Îñâîáîæäàåì áèáëèîòåêó RICHED32.DLL if(hRTFLib) FreeLibrary(hRTFLib); PostQuitMessage(0); return 0L; } // ----------------------------------------------------- // Ôóíêöèÿ WndProc_OnCommand // ----------------------------------------------------- #pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { CHARFORMAT cf; CHOOSEFONT chfnt; LOGFONT lf; HDC hDC; PARAFORMAT pf; switch (id) { // Èçìåíÿåì æèðíîñòü ñèìâîëîâ case ID_FORMAT_BOLD: { cf.cbSize = sizeof(cf); // Îïðåäåëÿåì ôîðìàò ñèìâîëîâ SendMessage(hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)&cf); // Èçìåíÿåì áèò ïîëÿ dwEffects, ñ ïîìîùüþ êîòîðîãî // ìîæíî âûäåëèòü ñèìâîëû êàê bold (æèðíîå íà÷åðòàíèå) cf.dwMask = CFM_BOLD; // Èíâåðòèðóåì áèò, îïðåäåëÿþùèé æèðíîå íà÷åðòàíèå cf.dwEffects ^= CFE_BOLD; // Èçìåíÿåì ôîðìàò ñèìâîëîâ SendMessage(hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); break; } // Óñòàíàâëèâàåì èëè îòìåíÿåì íàêëîííîå // íà÷åðòàíèå ñèìâîëîâ case ID_FORMAT_ITALIC: { cf.cbSize = sizeof(cf); SendMessage(hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)&cf); cf.dwMask = CFM_ITALIC; cf.dwEffects ^= CFE_ITALIC; SendMessage(hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); break; } // Óñòàíàâëèâàåì èëè îòìåíÿåì âûäåëåíèå // ñèìâîëîâ ïîä÷åðêèâàíèåì case ID_FORMAT_UNDERLINE: { cf.cbSize = sizeof(cf); SendMessage(hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)&cf); cf.dwMask = CFM_UNDERLINE; cf.dwEffects ^= CFE_UNDERLINE; SendMessage(hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); break; } // Èçìåíÿåì øðèôò ñèìâîëîâ case ID_FORMAT_FONT: { cf.cbSize = sizeof(cf); // Îïðåäåëÿåì òåêóùèé ôîðìàò ñèìâîëîâ SendMessage(hwndEdit, EM_GETCHARFORMAT, TRUE, (LPARAM)&cf); // Ñáðàñûâàåì ñîäåðæèìîå ñòðóêòóð, êîòîðûå áóäóò // èñïîëüçîâàòüñÿ äëÿ âûáîðà øðèôòà memset(&chfnt, 0, sizeof(chfnt)); memset(&lf, 0, sizeof(lf)); // Ïîëó÷àåì êîíòåêñò îòîáðàæåíèÿ hDC = GetDC(hWnd); // Åñëè áûëî çàäàíî âûäåëåíèå íàêëîíîì èëè æèðíûì øðèôòîì, // ïîäáèðàåì øðèôò ñ ñîîòâåòñòâóþùèìè àòðèáóòàìè lf.lfItalic = (BOOL)(cf.dwEffects & CFE_ITALIC); lf.lfUnderline = (BOOL)(cf.dwEffects & CFE_UNDERLINE); // Ïðåîáðàçóåì âûñîòó èç TWIPS-îâ â ïèêñåëû. // Óñòàíàâëèâàåì îòðèöàòåëüíûé çíàê, ÷òîáû // âûïîëíÿëîñü ïðåîáðàçîâàíèå è èñïîëüçîâàëîñü àáñîëþòíîå // çíà÷åíèå âûñîòû ñèìâîëîâ lf.lfHeight = - cf.yHeight/20; // Íàáîð ñèìâîëîâ, ïðèíÿòûé ïî óìîë÷àíèþ lf.lfCharSet = ANSI_CHARSET; // Êà÷åñòâî ñèìâîëîâ, ïðèíÿòîå ïî óìîë÷àíèþ lf.lfQuality = DEFAULT_QUALITY; // Âûáèðàåì ñåìåéñòâî øðèôòîâ lf.lfPitchAndFamily = cf.bPitchAndFamily; // Íàçâàíèå íà÷åðòàíèÿ øðèôòà lstrcpy(lf.lfFaceName, cf.szFaceName); // Óñòàíàâëèâàåì âåñ øðèôòà â çàâèñèìîñòè îò òîãî, // áûëî èñïîëüçîâàíî âûäåëåíèå æèðíûì øðèôòîì // èëè íåò if(cf.dwEffects & CFE_BOLD) lf.lfWeight = FW_BOLD; else lf.lfWeight = FW_NORMAL; // Çàïîëíÿåì ñòðóêòóðó äëÿ ôóíêöèè âûáîðà øðèôòà chfnt.lStructSize = sizeof(chfnt); chfnt.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT; chfnt.hDC = hDC; chfnt.hwndOwner = hWnd; chfnt.lpLogFont = &lf; chfnt.rgbColors = RGB(0,0,0); chfnt.nFontType = SCREEN_FONTTYPE; // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü äëÿ // âûáîðà øðèôòà if(ChooseFont(&chfnt)) { // Ìîæíî èñïîëüçîâàòü âñå áèòû ïîëÿ dwEffects cf.dwMask = CFM_BOLD | CFM_FACE | CFM_ITALIC | CFM_UNDERLINE | CFM_SIZE | CFM_OFFSET; // Ïðåîáðàçîâàíèå â TWIPS-û cf.yHeight = - lf.lfHeight * 20; // Óñòàíàâëèâàåì ïîëå dwEffects cf.dwEffects = 0; if(lf.lfUnderline) cf.dwEffects |= CFE_UNDERLINE; if(lf.lfWeight == FW_BOLD) cf.dwEffects |= CFE_BOLD; if(lf.lfItalic) cf.dwEffects |= CFE_ITALIC; // Óñòàíàâëèâàåì ñåìåéñòâî øðèôòà cf.bPitchAndFamily = lf.lfPitchAndFamily; // Óñòàíàâëèâàåì íàçâàíèå íà÷åðòàíèÿ øðèôòà lstrcpy(cf.szFaceName, lf.lfFaceName); // Èçìåíÿåì øðèôòîâîå îôîðìëåíèå ñèìâîëîâ SendMessage(hwndEdit, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); } // Îñâîáîæäàåì êîíòåêñò îòîáðàæåíèÿ ReleaseDC(hWnd, hDC); break; } // Óñòàíàâëèâàåì âûðàâíèâàíèå ïàðàãðàôà ïî ëåâîé ãðàíèöå // îêíà îðãàíà óïðàâëåíèÿ Rich Edit case ID_FORMAT_PARAGRAPH_LEFT: { pf.cbSize = sizeof(pf); pf.dwMask = PFM_ALIGNMENT; pf.wAlignment = PFA_LEFT; // Èçìåíÿåì òèï âûðàâíèâàíèÿ òåêóùåãî ïàðàãðàôà SendMessage(hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)&pf); break; } // Óñòàíàâëèâàåì âûðàâíèâàíèå ïàðàãðàôà ïî ïðàâîé ãðàíèöå // îêíà îðãàíà óïðàâëåíèÿ Rich Edit case ID_FORMAT_PARAGRAPH_RIGHT: { pf.cbSize = sizeof(pf); pf.dwMask = PFM_ALIGNMENT; pf.wAlignment = PFA_RIGHT; SendMessage(hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)&pf); break; } // Âûïîëíÿåì öåíòðîâêó òåêóùåãî ïàðàãðàôà case ID_FORMAT_PARAGRAPH_CENTER: { pf.cbSize = sizeof(pf); pf.dwMask = PFM_ALIGNMENT; pf.wAlignment = PFA_CENTER; SendMessage(hwndEdit, EM_SETPARAFORMAT, 0, (LPARAM)&pf); break; } // Ðåàëèçóåì ñòàíäàðòíûå ôóíêöèè ìåíþ Edit case ID_EDIT_UNDO: SendMessage(hwndEdit, EM_UNDO, 0, 0L); break; case ID_EDIT_CUT: SendMessage(hwndEdit, WM_CUT, 0, 0L); break; case ID_EDIT_COPY: SendMessage(hwndEdit, WM_COPY, 0, 0L); break; case ID_EDIT_PASTE: SendMessage(hwndEdit, WM_PASTE, 0, 0L); break; case ID_EDIT_DELETE: SendMessage(hwndEdit, WM_CLEAR, 0, 0L); break; // Âûäåëÿåì âåñü òåêñò, êîòîðûé åñòü â îêíå // îðãàíà óïðàâëåíèÿ Rich Edit case ID_EDIT_SELECTALL: { CHARRANGE charr; charr.cpMin = 0; // îò íà÷àëà... charr.cpMax = -1; // ... è äî êîíöà òåêñòà SendMessage(hwndEdit, EM_EXSETSEL, 0, (LPARAM)&charr); break; } // Ïðè ñîçäàíèè íîâîãî òåêñòà óäàëÿåì òåêóùåå // ñîäåðæèìîå îêíà ðåäàêòèðîâàíèÿ case ID_FILE_NEW: SetWindowText(hwndEdit,"\0"); break; case ID_FILE_OPEN: FileOpen(hWnd); // çàãðóæàåì ôàéë äëÿ ðåäàêòèðîâàíèÿ break; case ID_FILE_SAVEAS: FileSaveAs(hWnd); // ñîõðàíÿåì òåêñò â ôàéëå break; case ID_FILE_PRINT: FilePrint(); // ïå÷àòàåì òåêñò break; case ID_FILE_EXIT: PostQuitMessage(0); // çàâåðøàåì ðàáîòó ïðèëîæåíèÿ break; case ID_HELP_ABOUT: MessageBox(hWnd, "Rich Text Editor RtfPad, v.2.0\n" "(C) Serhii V. Yehorov, 2016\n" "Email: sehorov@gmail.com", szAppTitle, MB_OK | MB_ICONINFORMATION); break; default: break; } return FORWARD_WM_COMMAND(hWnd, id, hwndCtl, codeNotify, DefWindowProc); } // ----------------------------------------------------- // Ôóíêöèÿ WndProc_OnSize // ----------------------------------------------------- #pragma warning(disable: 4098) void WndProc_OnSize(HWND hwnd, UINT state, int cx, int cy) { SendMessage(hwndToolBar, TB_AUTOSIZE, 0, 0); MoveWindow(hwndEdit, 0, 0, cx, cy, TRUE); return FORWARD_WM_SIZE(hwnd, state, cx, cy, DefWindowProc); } // ----------------------------------------------------- // Ôóíêöèÿ WndProc_OnSetFocus // ----------------------------------------------------- #pragma warning(disable: 4098) void WndProc_OnSetFocus(HWND hwnd, HWND hwndOldFocus) { // Êîãäà ãëàâíîå îêíî íàøåãî ïðèëîæåíèÿ ïîëó÷àåò // ôîêóñ ââîäà, îíî ïåðåäàåò ôîêóñ ââîäà îêíó // îðãàíà óïðàâëåíèÿ Rich Edit SetFocus(hwndEdit); return FORWARD_WM_SETFOCUS(hwnd, hwndOldFocus, DefWindowProc); } // ----------------------------------------------------- // Ôóíêöèÿ FileSaveAs // ----------------------------------------------------- void FileSaveAs(HWND hwnd) { OPENFILENAME ofn; char szFile[256] = "untitled.rtf"; char szDirName[512]; char szFileTitle[256]; // Ôèëüòð äîïóñêàåò ñîõðàíåíèå òåêñòà â ôàéëå ñ // ðàñøèðåíèåì èìåíè rtf, txt, èëè ëþáûì äðóãèì char szFilter[256] = "Rich Text Files\0*.rtf\0Text Files\0*.txt\0" "Any Files\0*.*\0"; HFILE hFile; OFSTRUCT of; EDITSTREAM es; memset(&ofn, 0, sizeof(OPENFILENAME)); // Îïðåäåëÿåì ïóòü ê òåêóùåìó êàòàëîãó GetCurrentDirectory(sizeof(szDirName), szDirName); // Çàïîëíÿåì ñòðóêòóðó äëÿ âûáîðà âûõîäíîãî ôàéëà ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFilter = szFilter; ofn.lpstrInitialDir = szDirName; ofn.nFilterIndex = 1; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = sizeof(szFileTitle); ofn.lpstrDefExt = "rtf"; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ // äëÿ âûáîðà âûõîäíîãî ôàéëà if(GetSaveFileName(&ofn)) { // Åñëè ôàéë âûáðàí, îòêðûâàåì åãî äëÿ çàïèñè èëè // ñîçäàåì if (*ofn.lpstrFile) { hFile = OpenFile(ofn.lpstrFile, &of, OF_CREATE); // Óñòàíàâëèâàåì ïàðàìåòðû ôóíêöèè îáðàòíîãî âûçîâà, // êîòîðàÿ áóäåò âûïîëíÿòü çàïèñü es.dwCookie = (DWORD)hFile; es.dwError = 0; es.pfnCallback = (EDITSTREAMCALLBACK)SaveCallback; // Åñëè ðàñøèðåíèå ôàéëà rtf, ôàéë ñîõðàíÿåòñÿ êàê // rtf-ôàéë.  ïðîòèâíîì ñëó÷àå îí ñîõðàíÿåòñÿ êàê // îáû÷íûé òåêñòîâûé ôàéë _strupr(&ofn.lpstrFile[ofn.nFileExtension]); if(!strncmp(&ofn.lpstrFile[ofn.nFileExtension], "RTF", 3)) SendMessage(hwndEdit, EM_STREAMOUT, SF_RTF, (LPARAM)&es); else SendMessage(hwndEdit, EM_STREAMOUT, SF_TEXT, (LPARAM)&es); // Çàêðûâàåì ôàéë _lclose(hFile); // Ñáðàñûâàåì ïðèçíàê èçìåíåíèÿ ñîäåðæèìîãî îêíà // ðåäàêòîðà òåêñòà SendMessage(hwndEdit, EM_SETMODIFY, FALSE, 0L); } } } // ----------------------------------------------------- // Ôóíêöèÿ SaveCallback // ----------------------------------------------------- DWORD CALLBACK SaveCallback(DWORD dwCookie, LPCCH pbBuff, LONG cb, LONG *pcb) { // Âûïîëíÿåì çàïèñü áëîêà äàííûõ äëèíîé cb áàéò cb = _lwrite((HFILE)dwCookie, pbBuff, cb); *pcb = cb; return 0; } // ----------------------------------------------------- // Ôóíêöèÿ FileOpen // ----------------------------------------------------- void FileOpen(HWND hwnd) { OPENFILENAME ofn; char szFile[256]; char szDirName[256]; char szFileTitle[256]; char szFilter[256] = "Rich Text Files\0*.rtf\0Text Files\0*.txt\0" "Any Files\0*.*\0"; HFILE hFile; OFSTRUCT of; EDITSTREAM es; memset(&ofn, 0, sizeof(OPENFILENAME)); GetCurrentDirectory(sizeof(szDirName), szDirName); szFile[0] = '\0'; // Ïîäãîòàâëèâàåì ñòðóêòóðó äëÿ âûáîðà âõîäíîãî ôàéëà ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFilter = szFilter; ofn.lpstrInitialDir = szDirName; ofn.nFilterIndex = 1; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = sizeof(szFileTitle); ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ // äëÿ âûáîðà âõîäíîãî ôàéëà if(GetOpenFileName(&ofn)) { // Åñëè ôàéë âûáðàí, îòêðûâàåì åãî äëÿ ÷òåíèÿ if (*ofn.lpstrFile) { hFile = OpenFile(ofn.lpstrFile, &of, OF_READ); // Óñòàíàâëèâàåì ïàðàìåòðû ôóíêöèè îáðàòíîãî âûçîâà, // êîòîðàÿ áóäåò âûïîëíÿòü ÷òåíèå es.dwCookie = (DWORD)hFile; es.dwError = 0; es.pfnCallback = OpenCallback; // Åñëè ðàñøèðåíèå ôàéëà rtf, ôàéë çàãðóæàåòñÿ êàê // rtf-ôàéë.  ïðîòèâíîì ñëó÷àå îí çàãðóæàåòñÿ êàê // îáû÷íûé òåêñòîâûé ôàéë _strupr(&ofn.lpstrFile[ofn.nFileExtension]); if(!strncmp(&ofn.lpstrFile[ofn.nFileExtension], "RTF", 3)) SendMessage(hwndEdit, EM_STREAMIN, SF_RTF, (LPARAM)&es); else SendMessage(hwndEdit, EM_STREAMIN, SF_TEXT, (LPARAM)&es); // Çàêðûâàåì ôàéë _lclose(hFile); // Ñáðàñûâàåì ïðèçíàê èçìåíåíèÿ ñîäåðæèìîãî îêíà // ðåäàêòîðà òåêñòà SendMessage(hwndEdit, EM_SETMODIFY, FALSE, 0L); } } } // ----------------------------------------------------- // Ôóíêöèÿ OpenCallback // ----------------------------------------------------- DWORD CALLBACK OpenCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb) { // Âûïîëíÿåì ÷òåíèå áëîêà äàííûõ äëèíîé cb áàéò *pcb = _lread((HFILE)dwCookie, pbBuff, cb); if(*pcb <= 0) *pcb = 0; return 0; } // ----------------------------------------------------- // Ôóíêöèÿ FilePrint // ----------------------------------------------------- void FilePrint(void) { FORMATRANGE fr; DOCINFO docInfo; LONG lLastChar, lTextSize; PRINTDLG pd; int nRc; HDC hPrintDC; // Èíèöèàëèçèðóåì ïîëÿ ñòðóêòóðû PRITDLG memset(&pd, 0, sizeof(pd)); pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner = hwndEdit; pd.hInstance = hInst; pd.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_PRINTSETUP | PD_ALLPAGES; pd.nFromPage = 0xffff; pd.nToPage = 0xffff; pd.nMinPage = 0; pd.nMaxPage = 0xffff; pd.nCopies = 1; // Âûâîäèì íà ýêðàí äèàëîãîâóþ ïàíåëü, ïðåäíàçíà÷åííóþ // äëÿ ïå÷àòè äîêóìåíòà if(PrintDlg(&pd) == TRUE) { hPrintDC = pd.hDC; // Èíèöèàëèçèðóåì ïîëÿ ñòðóêòóðû FORMATRANGE memset(&fr, 0, sizeof(fr)); // Áóäåì ïå÷àòàòü ñ èñïîëüçîâàíèåì êîíòåêñòà // ïðèíòåðà, ïîëó÷åííîãî îò ôóíêöèè PrintDlg fr.hdc = fr.hdcTarget = hPrintDC; // Ïå÷àòàåì âåñü äîêóìåíò fr.chrg.cpMin = 0; fr.chrg.cpMax = -1; // Óñòàíàâëèâàåì ðàçìåðû ñòðàíèöû â TWIPS-àõ fr.rcPage.top = 0; fr.rcPage.left = 0; fr.rcPage.right = MulDiv(GetDeviceCaps(hPrintDC, PHYSICALWIDTH), 1440, GetDeviceCaps(hPrintDC, LOGPIXELSX)); fr.rcPage.bottom = MulDiv(GetDeviceCaps(hPrintDC, PHYSICALHEIGHT), 1440, GetDeviceCaps(hPrintDC, LOGPIXELSY)); fr.rc = fr.rcPage; // Îñòàâëÿåì ïîëÿ if(fr.rcPage.right > 2*3*1440/4+1440) fr.rc.right -= (fr.rc.left = 3*1440/4); if(fr.rcPage.bottom > 3*1440) fr.rc.bottom -= (fr.rc.top = 1440); // Çàïîëíÿåì ïîëÿ ñòðóêòóðû DOCINFO memset(&docInfo, 0, sizeof(DOCINFO)); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszOutput = NULL; docInfo.lpszDocName = "RtfPad document"; // Íà÷èíàåì ïå÷àòü äîêóìåíòà nRc = StartDoc(hPrintDC, &docInfo); // Åñëè ïðîèçîøëà îøèáêà, ïîëó÷àåì è âûâîäèì íà ýêðàí // êîä îøèáêè if(nRc < 0) { char szErr[128]; DWORD dwErr = GetLastError(); wsprintf(szErr, "Print Error %ld", dwErr); MessageBox(NULL, szErr, szAppTitle, MB_OK | MB_ICONEXCLAMATION); DeleteDC(hPrintDC); return; } // Íà÷èíàåì ïå÷àòü ñòðàíèöû StartPage(hPrintDC); lLastChar = 0; // Îïðåäåëÿåì äëèíó òåêñòà â áàéòàõ lTextSize = SendMessage(hwndEdit, WM_GETTEXTLENGTH, 0, 0); // Öèêë ïî âñåì ñòðàíèöàì äîêóìåíòà while (lLastChar < lTextSize) { // Ôîðìàòèðóåì äàííûå äëÿ ïðèíòåðà è ïå÷àòàåì èõ lLastChar = SendMessage(hwndEdit, EM_FORMATRANGE, TRUE, (LPARAM) &fr); if(lLastChar < lTextSize) { // Çàâåðøàåì ïå÷àòü î÷åðåäíîé ñòðàíèöû EndPage(hPrintDC); // Íà÷èíàåì íîâóþ ñòðàíèöó StartPage(hPrintDC); fr.chrg.cpMin = lLastChar; fr.chrg.cpMax = -1; } } // Óäàëÿåì èíôîðìàöèþ, êîòîðàÿ õðàíèòñÿ â // îðãàíå óïðàâëåíèÿ Rich Edit SendMessage(hwndEdit, EM_FORMATRANGE, TRUE, (LPARAM)NULL); // Çàâåðøàåì ïå÷àòü ñòðàíèöû EndPage(hPrintDC); // Çàâåðøàåì ïå÷àòü äîêóìåíòà EndDoc(hPrintDC); // Óäàëÿåì êîíòåêñò ïðèíòåðà DeleteDC(hPrintDC); } } | Äîáàâëåíî: Ïðîáëåìà ðåøåíà. Èñïðàâèòü WndProc_OnSize ÷òîá ïðàâèëüíî ïåðåìåùàë hwndEdit. Ñìîòðèòå íà WndProc_OnCreate |