Ïåðåéòè èç ôîðóìà íà ñàéò.

ÍîâîñòèÔàéëîâûå àðõèâû
ÏîèñêÀêòèâíûå òåìûÒîï ëèñò
ÏðàâèëàÊòî â on-line?
Âõîä Çàáûëè ïàðîëü? Ïåðâûé ðàç íà ýòîì ñàéòå? Ðåãèñòðàöèÿ
Êîìïüþòåðíûé ôîðóì Ru.Board » Êîìïüþòåðû » Ïðèêëàäíîå ïðîãðàììèðîâàíèå » ReachEdit çàêðûâàåò ïàíåëü èíñòðóìåíòîâ

Ìîäåðèðóåò : ShIvADeSt

ShIvADeSt (16-01-2017 02:53): Ïðîáëåìà ðåøåíà òîïèê ñòàðòåðîì  Âåðñèÿ äëÿ ïå÷àòè • ÏîäïèñàòüñÿÄîáàâèòü â çàêëàäêè

   

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  

Âñåãî çàïèñåé: 22 | Çàðåãèñòð. 06-01-2016 | Îòïðàâëåíî: 17:00 14-01-2017
   

Êîìïüþòåðíûé ôîðóì Ru.Board » Êîìïüþòåðû » Ïðèêëàäíîå ïðîãðàììèðîâàíèå » ReachEdit çàêðûâàåò ïàíåëü èíñòðóìåíòîâ
ShIvADeSt (16-01-2017 02:53): Ïðîáëåìà ðåøåíà òîïèê ñòàðòåðîì


Ðåêëàìà íà ôîðóìå Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Ðåéòèíã.ru