你是说在程序内部就变回去了?
如果是那样也可以前面加static,声明成静态变量,如static int a;
但是如果你在这个函数以外也想使用这个函数,就象上面说的,声明成
全局的

解决方案 »

  1.   

    一般是永久的配置存储最好写在磁盘上面,而不是存在内存中-关机就消失了。
    1:写注册表,使用操作注册表的API函数就可以了。下次运行读取配置就行。
    2:磁盘文件。可以是Ini文件(很常见),XML文件,CFG文件,实际上只要你自己能正确读写就可以啦。
    明白了没有??
      

  2.   

    我的程序里有多个类,在一个类里面做打印设置,另一个类里面做打印预览和打印,每次我都重新得到打印机的DC,打印设置完了再做打印的时候得到的DC并不是我设置了之后的。
    我希望能在打印的时候得到打印设置好了的DC,怎么做?
      

  3.   

    现在我想用全局变量保存。
    还是有问题,打印机的东西那么多,我不知道该保存哪一个。
    比如从PAGESETUPDLG设置后可以得到一个DEVMODE 的句柄,
    我保存了这个句柄就可以了么?但是后面在打印预览的时候我
    需要用的是DEVEMODE 结构。句柄怎么转换成结构?
      

  4.   


    SetPrinter(hPrinter,2,pPrinter,0);
    在什么情况下会出assert错?
    ATL: ERROR - Object deleted before window was destroyed
      

  5.   

    打印设置完了再做打印的时候得到的DC并不是我设置了之后的。???????????????????????类的实例难道没有保存状态的功能?可能是dc与类间的关系搞错了。
      

  6.   

    不是啦,我每次都是重新得到dc的,设置与打印是不同的函数,而且设置的时候根本就得不到打印DC。打印函数需要自己得到dc,跟设置就没有关系了。所以我希望在打印设置后保存设置内容,打印之前用打印设置的内容来设置一下打印机。现在前面没有问题,就是在打印中设置打印机的时候SetPrinter出错
      

  7.   

    不是。我在设置时候没有得到dc。现在保存设置在全局变量里面,然后打印的时候读取保存的变量,用来设置打印机。设置时候SetPrinter出错
      

  8.   

    在OnPrint()中用GetDC;再把保存不可以吗?
      

  9.   

    我在设置里面不能得到dc。只有通过打印对话框才能得到dc。
    我就想把设置里面改动的东西保存下来。现在关键是SetPrinter一整天了都没搞定!我都快要气死了!!
    错在哪儿?
            pPrintinfo->pDevMode = (DEVMODE*)GlobalLock(hDevMode);
            long lNeeded;
            lNeeded = DocumentProperties(m_hWnd,hPrinter,PrinterName,NULL,NULL,0);
            pDevMode = (DEVMODE*) malloc(lNeeded);  //申请内存
            ret = DocumentProperties(m_hWnd,hPrinter,PrinterName,pDevMode,NULL,DM_OU
    UFFER);
            memcpy(pDevMode,pPrintinfo->pDevMode,lNeeded);
            ret = DocumentProperties(m_hWnd,hPrinter,PrinterName,pDevMode,pDevMode,D
    UT_BUFFER|DM_IN_BUFFER);
    //      err = GetLastError();
            memcpy(pPrintinfo->pDevMode,pDevMode,lNeeded);
            if(!SetPrinter(hPrinter,2,(LPBYTE)pPrintinfo,0))
            {
                    err = GetLastError();
                    if(err)
                    {
                            return;    
                    }
            }
    结果:err = 5 拒绝访问。是不是还有什么权限要设置?
      

  10.   

    自己把所有的东西存起来行吗? 虽然麻烦一点,我就是这么做的----------------- .h ---------------------------------- 
    #define MAX_PRINT_FONT_SIZE 36#define SECTION_PRINT_SETTING "PrintSetting"
    #define ENTRY_PRINT_SETTING_PRINT_FONT "PrintFont"
    #define ENTRY_PRINT_SETTING_FONT_ITALIC "FontItalic"
    #define ENTRY_PRINT_SETTING_FONT_WEIGHT "FontWeight"
    #define ENTRY_PRINT_SETTING_FONT_SIZE "FontSize"
    #define ENTRY_PRINT_SETTING_FONT_HEIGHT "FontHeight"
    #define PRINT_SETTING_DEFAULT_PRINT_FONT "宋体"
    #define PRINT_SETTING_DEFAULT_FONT_ITALIC 0
    #define PRINT_SETTING_DEFAULT_FONT_WEIGHT FW_NORMAL
    #define PRINT_SETTING_DEFAULT_FONT_SIZE 8
    #define PRINT_SETTING_DEFAULT_FONT_HEIGHT -11struct DECLARE_DLL_PUBLIC_CLASS CPrintSetting {
    CString m_printFont;
    BYTE m_fontItalic;
    int m_fontWeight;
    int m_fontSize; // point size
    // save the LOGFONT::lfHeight
    int m_fontHeight;

    CPrintSetting()
    {
    m_printFont= PRINT_SETTING_DEFAULT_PRINT_FONT;
    m_fontItalic= PRINT_SETTING_DEFAULT_FONT_ITALIC;
    m_fontWeight= PRINT_SETTING_DEFAULT_FONT_WEIGHT;
    m_fontSize= PRINT_SETTING_DEFAULT_FONT_SIZE;
    m_fontHeight= PRINT_SETTING_DEFAULT_FONT_HEIGHT;
    }
    void Save();
    void Load();
    void ConvertFromLogFont(const LOGFONT& LogFont);
    void FillIntoLogFont(LOGFONT& LogFont);
    CString GetFontStyle();
    static LONG HeightToPoint(LONG lfHeight); // convert height to point
    static BOOL PopupFontDlg(LOGFONT* pLogFont);
    };
    ----------------------------------------------------
    ---------------- cpp ------------------------------
    void CPrintSetting::Save()
    {
    AfxGetApp()->WriteProfileString( SECTION_PRINT_SETTING,ENTRY_PRINT_SETTING_PRINT_FONT,m_printFont);
    AfxGetApp()->WriteProfileInt( SECTION_PRINT_SETTING,ENTRY_PRINT_SETTING_FONT_ITALIC,m_fontItalic);
    AfxGetApp()->WriteProfileInt( SECTION_PRINT_SETTING,ENTRY_PRINT_SETTING_FONT_WEIGHT,m_fontWeight);
    AfxGetApp()->WriteProfileInt( SECTION_PRINT_SETTING,ENTRY_PRINT_SETTING_FONT_SIZE,m_fontSize);
    AfxGetApp()->WriteProfileInt( SECTION_PRINT_SETTING,ENTRY_PRINT_SETTING_FONT_HEIGHT,m_fontHeight);
    }void CPrintSetting::Load()
    {
    m_printFont=AfxGetApp()->GetProfileString(SECTION_PRINT_SETTING ,ENTRY_PRINT_SETTING_PRINT_FONT, PRINT_SETTING_DEFAULT_PRINT_FONT);
    m_fontItalic=(BYTE)AfxGetApp()->GetProfileInt(SECTION_PRINT_SETTING ,ENTRY_PRINT_SETTING_FONT_ITALIC, PRINT_SETTING_DEFAULT_FONT_ITALIC);
    m_fontWeight=AfxGetApp()->GetProfileInt(SECTION_PRINT_SETTING ,ENTRY_PRINT_SETTING_FONT_WEIGHT, PRINT_SETTING_DEFAULT_FONT_WEIGHT);
    m_fontSize=AfxGetApp()->GetProfileInt(SECTION_PRINT_SETTING ,ENTRY_PRINT_SETTING_FONT_SIZE, PRINT_SETTING_DEFAULT_FONT_SIZE);
    m_fontHeight=AfxGetApp()->GetProfileInt(SECTION_PRINT_SETTING ,ENTRY_PRINT_SETTING_FONT_HEIGHT, PRINT_SETTING_DEFAULT_FONT_HEIGHT);
    }// static
    LONG CPrintSetting::HeightToPoint(LONG lfHeight)
    {
    CDC dc;
    float flt; dc.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    flt= - (float)(lfHeight * 72) / GetDeviceCaps(dc.m_hDC, LOGPIXELSY);
    return (flt - (int) flt) > 0.5 ? (int)flt + 1 : (int)flt;
    } // end of HeightToPoint()// static
    // return: TRUE, pLogFont is the new log font
    //    FALSE,pLogFont not change
    BOOL CPrintSetting::PopupFontDlg(LOGFONT* pLogFont)
    {
    LOGFONT LogFont;
    CFontDialog FontDlg(pLogFont,CF_BOTH); if (FontDlg.DoModal() == IDOK) {
    FontDlg.GetCurrentFont(&LogFont);
    if (CPrintSetting::HeightToPoint(LogFont.lfHeight) > MAX_PRINT_FONT_SIZE) {
    CString string; string.Format("打印字体设置过大!保留当前的打印字体设置.\n说明:打印字体最大为%d",MAX_PRINT_FONT_SIZE);
    AfxMessageBox(string);
    return FALSE; // NOT update the setting
    }
    *pLogFont=LogFont;
    return TRUE;
    }
    return FALSE;
    } // end of PopupFontDlg()// only fill some fields of log-font, not change other fields
    void CPrintSetting::FillIntoLogFont(LOGFONT& LogFont)
    {
    lstrcpy(LogFont.lfFaceName, m_printFont);
    LogFont.lfItalic = m_fontItalic;
    LogFont.lfWeight = m_fontWeight;
    LogFont.lfHeight = m_fontHeight;
    } // end of ConvertToLogFont()void CPrintSetting::ConvertFromLogFont(const LOGFONT& LogFont)
    {
    CDC dc;
    float flt; // save the print setting
    dc.CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
    m_printFont= LogFont.lfFaceName;
    m_fontItalic= LogFont.lfItalic;
    m_fontWeight= LogFont.lfWeight;
    flt= - (float)(LogFont.lfHeight * 72) / GetDeviceCaps(dc.m_hDC, LOGPIXELSY);
    m_fontSize = (flt - (int) flt) > 0.5 ? (int)flt + 1 : (int)flt;
    m_fontHeight= LogFont.lfHeight;
    } // end of ConvertFromLogFont()CString CPrintSetting::GetFontStyle()
    {
    CString FontStyle=" 未知";
    if (m_fontItalic == FALSE && m_fontWeight == FW_NORMAL)
    FontStyle=" 规则";
    if (m_fontItalic == TRUE  && m_fontWeight == FW_NORMAL)
    FontStyle=" 斜体";
    if (m_fontItalic == FALSE && m_fontWeight == FW_BOLD)
    FontStyle=" 粗体";
    if (m_fontItalic == TRUE  && m_fontWeight == FW_BOLD)
    FontStyle=" 粗斜体";
    return FontStyle;
    } // end of GetFontStyle()