是这样,项目使用的是MFC自带的打印预览组件,里面的按钮有【prin】、【next page】、【prev page】等,现我想改变下这些按钮的名称,但是不知道怎么获得它的句柄,求教各位大侠 了。200分相送

解决方案 »

  1.   

    下面是MFC自己的实现:BOOL CView::DoPrintPreview(UINT nIDResource, CView* pPrintView,
    CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
    {
    ASSERT_VALID_IDR(nIDResource);
    ASSERT_VALID(pPrintView);
    ASSERT(pPreviewViewClass != NULL);
    ASSERT(pPreviewViewClass->IsDerivedFrom(RUNTIME_CLASS(CPreviewView)));
    ASSERT(pState != NULL); CFrameWnd* pParent = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
    ASSERT_VALID(pParent); CCreateContext context;
    context.m_pCurrentFrame = pParent;
    context.m_pCurrentDoc = GetDocument();
    context.m_pLastView = this; // Create the preview view object
    CPreviewView* pView = (CPreviewView*)pPreviewViewClass->CreateObject();
    if (pView == NULL)
    {
    TRACE0("Error: Failed to create preview view.\n");
    return FALSE;
    }
    ASSERT_KINDOF(CPreviewView, pView);
    pView->m_pPreviewState = pState;        // save pointer pParent->OnSetPreviewMode(TRUE, pState);    // Take over Frame Window // Create the toolbar from the dialog resource
    pView->m_pToolBar = new CDialogBar;
    if (!pView->m_pToolBar->Create(pParent, MAKEINTRESOURCE(nIDResource),
    CBRS_TOP, AFX_IDW_PREVIEW_BAR))

    {
    TRACE0("Error: Preview could not create toolbar dialog.\n");
    pParent->OnSetPreviewMode(FALSE, pState);   // restore Frame Window
    delete pView->m_pToolBar;       // not autodestruct yet
    pView->m_pToolBar = NULL;
    pView->m_pPreviewState = NULL;  // do not delete state structure
    delete pView;
    return FALSE;
    }
    pView->m_pToolBar->m_bAutoDelete = TRUE;    // automatic cleanup // Create the preview view as a child of the App Main Window.  This
    // is a sibling of this view if this is an SDI app.  This is NOT a sibling
    // if this is an MDI app. if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
    CRect(0,0,0,0), pParent, AFX_IDW_PANE_FIRST, &context))
    {
    TRACE0("Error: couldn't create preview view for frame.\n");
    pParent->OnSetPreviewMode(FALSE, pState);   // restore Frame Window
    pView->m_pPreviewState = NULL;  // do not delete state structure
    delete pView;
    return FALSE;
    } // Preview window shown now pState->pViewActiveOld = pParent->GetActiveView();
    CView* pActiveView = pParent->GetActiveFrame()->GetActiveView();
    if (pActiveView != NULL)
    pActiveView->OnActivateView(FALSE, pActiveView, pActiveView); if (!pView->SetPrintView(pPrintView))
    {
    pView->OnPreviewClose();
    return TRUE;            // signal that OnEndPrintPreview was called
    } pParent->SetActiveView(pView);  // set active view - even for MDI // update toolbar and redraw everything
    pView->m_pToolBar->SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE);
    pParent->RecalcLayout();            // position and size everything
    pParent->UpdateWindow(); return TRUE;
    }
    希望对楼主有帮助。
      

  2.   

    另外使用的资源在vs的安装目录:
    C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\l.chs\AFXPRINT.RC我试着修改了但不起作用。
      

  3.   

    CPreviewView中的 CDialogBar* m_pToolBar; // Toolbar for preview
    这个就是那个DialogBar,如果想修改这下按钮,建议继承CPreviewView,然后取得m_pToolBar,然后得到各个ID,才可以修改!
      

  4.   

    对应的资源:
    AFX_IDD_PREVIEW_TOOLBAR DIALOG PRELOAD DISCARDABLE  0, 0, 330, 16
    STYLE WS_CHILD | 0x04
    FONT 8, "MS Shell Dlg"
    BEGIN
    PUSHBUTTON      "打印(&P)...",AFX_ID_PREVIEW_PRINT,2,2,44,12
    PUSHBUTTON      "下一页(&N)",AFX_ID_PREVIEW_NEXT,48,2,44,12
    PUSHBUTTON      "前一页(&V)",AFX_ID_PREVIEW_PREV,94,2,44,12
    PUSHBUTTON      "",AFX_ID_PREVIEW_NUMPAGE,140,2,44,12
    PUSHBUTTON      "放大(&I)",AFX_ID_PREVIEW_ZOOMIN,186,2,44,12
    PUSHBUTTON      "缩小(&O)",AFX_ID_PREVIEW_ZOOMOUT,232,2,44,12
    PUSHBUTTON      "关闭(&C)",AFX_ID_PREVIEW_CLOSE,278,2,44,12
    END
      

  5.   

    修改 了 ,但是不起作用啊?有没有这样的函数:OnBeginPrintPreview(),然后根据里面的参数,获得按钮的句柄后作修改啊?
      

  6.   

    printdialog 是根据语言区域来选择显示中文还是英文的button的.
    你只是想把 按钮上的button换成中文的, 还是想改成其他的名称?
      

  7.   

    如果只是想english改成中文, 项目属性--resources--culture选成中文就OK
      

  8.   

    问题 是这样,这个软件有3个语系,有en、si、tr,我的要求是在不同的语系下显示相应的文字,而不要总是同一个资源。
      

  9.   

    你看一下:
    主要调用的是这个函数:void CView::OnFilePrintPreview()
    而void CView::OnFilePrintPreview()调用的是 BOOL CView::DoPrintPreview(UINT nIDResource, CView* pPrintView,
    CRuntimeClass* pPreviewViewClass, CPrintPreviewState* pState)
    你可以在调用处,不要调用OnFilePrintPreview,而是调用一个自己命名的函数,然后,里面内容与OnFilePrintPreview差不多,只是将BOOL CView::DoPrintPreview这个地方改一下,改成其它函数名称,比如是BOOL DoPrintPreview_back(....),参数一样,然后写这个函数,里面内容也差不多,只是在这儿,改写名称就行了!
    pView->m_pToolBar = new CDialogBar;
    if (!pView->m_pToolBar->Create(pParent, MAKEINTRESOURCE(nIDResource),
    CBRS_TOP, AFX_IDW_PREVIEW_BAR))
    {
    TRACE0("Error: Preview could not create toolbar dialog.\n");
    pParent->OnSetPreviewMode(FALSE, pState);   // restore Frame Window
    delete pView->m_pToolBar;       // not autodestruct yet
    pView->m_pToolBar = NULL;
    pView->m_pPreviewState = NULL;  // do not delete state structure
    delete pView;
    return FALSE;
    }
    在这段代码的后面,改写一下:
    pView->m_pToolBar->GetDlgItem(AFX_ID_PREVIEW_PRINT)->SetWindowText("print other name");
    其它的也一样改!
    这样改就是有点繁,但是,基本有效!
      

  10.   

    多语言~ 需要把不同的资源封装到不同语言的dll中...
    自己界面的资源你肯定已经实现这一步了~打印对话框也一样1.  把不同语言的 C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\l.xxxlang\AFXPRINT.RC 
    分别封装为不同的xxx_lang_dll2. 调用的时候
    HINSTANCE hOldRes = AfxGetResourceHandle(); 
    AfxSetResourceHandle(hDll);  // hDll 是 LoadLibrary("xxx_lang_dll") 的返回值 
    // call print dlg
    AfxSetResourceHandle(hOldRes); 
      

  11.   

    你改那个当然不起作用,除非你把MFC重新编译你应该把需要的部分复制到你自己的工程里,并修改如下
    // Preview Toolbar Dialog
    AFX_IDD_PREVIEW_TOOLBAR DIALOG PRELOAD DISCARDABLE  0, 0, 330, 16
    STYLE WS_CHILD | 0x04
    FONT 8, "MS Shell Dlg"
    BEGIN
    PUSHBUTTON      "打印(&P)...",AFX_ID_PREVIEW_PRINT,2,2,44,12
    PUSHBUTTON      "下一页(&N)",AFX_ID_PREVIEW_NEXT,48,2,44,12
    PUSHBUTTON      "前一页(&V)",AFX_ID_PREVIEW_PREV,94,2,44,12
    PUSHBUTTON      "",AFX_ID_PREVIEW_NUMPAGE,140,2,44,12
    PUSHBUTTON      "放大(&I)",AFX_ID_PREVIEW_ZOOMIN,186,2,44,12
    PUSHBUTTON      "缩小(&O)",AFX_ID_PREVIEW_ZOOMOUT,232,2,44,12
    PUSHBUTTON      "关闭(&C)",AFX_ID_PREVIEW_CLOSE,278,2,44,12
    END然后在你自己的工程里修改
    把AFX_IDD_PREVIEW_TOOLBAR改为你自己的定义,如IDD_PREVIEW_TOOLBAR,并在resource.h 加上定义#define IDD_PREVIEW_TOOLBAR         150(这个值自己定义)
    IDD_PREVIEW_TOOLBAR DIALOG PRELOAD DISCARDABLE  0, 0, 330, 16
    STYLE WS_CHILD | 0x04
    FONT 8, "MS Shell Dlg"
    BEGIN
    PUSHBUTTON      "my打印(&P)...",AFX_ID_PREVIEW_PRINT,2,2,44,12
    PUSHBUTTON      "my下一页(&N)",AFX_ID_PREVIEW_NEXT,48,2,44,12
    PUSHBUTTON      "my前一页(&V)",AFX_ID_PREVIEW_PREV,94,2,44,12
    PUSHBUTTON      "",AFX_ID_PREVIEW_NUMPAGE,140,2,44,12
    PUSHBUTTON      "my放大(&I)",AFX_ID_PREVIEW_ZOOMIN,186,2,44,12
    PUSHBUTTON      "my缩小(&O)",AFX_ID_PREVIEW_ZOOMOUT,232,2,44,12
    PUSHBUTTON      "my关闭(&C)",AFX_ID_PREVIEW_CLOSE,278,2,44,12
    END在你自己的view处理ID_FILE_PRINT_PREVIEW时间
    并把系统生成的去掉//这个是系统生成的默认调用CView的,要去掉 ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &Clsdi1View::OnFilePrintPreview)
    #include <afxpriv.h>
    void Clsdi1View::OnFilePrintPreview()
    {
    CPrintPreviewState* pState = new CPrintPreviewState; TRY
    {//IDD_PREVIEW_TOOLBAR.自己定义的那个资源
    if (!DoPrintPreview(IDD_PREVIEW_TOOLBAR, this,
    RUNTIME_CLASS(CPreviewView), pState))
    {
    TRACE(traceAppMsg, 0, "Error: DoPrintPreview failed.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    delete pState;      // preview failed to initialize, delete State now
    }
    }
    CATCH_ALL(e)
    {
    delete pState;
    THROW_LAST();
    }
    END_CATCH_ALL
    }
      

  12.   

    呵呵,大家都那么热心,多谢了,问题解决了,我就是使用 楼上的办法,在OnFilePrintPreview里面
    CPrintPreviewState* pState = new CPrintPreviewState;
    if (!DoPrintPreview(IDD_PRINT_PREVIEW, this, RUNTIME_CLASS(CPreviewView), pState))
    {
    // In derived classes, reverse special window handling here for
    // Preview failure case

    TRACE0("Error: DoPrintPreview failed.\n");
    AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
    delete pState;      // preview failed to initialize, delete State now
    pState = NULL;
    }
    将其中的资源部分替换掉,就可以使用了 。