我怎么能把打印设置保留下来呀?写注册表? 你是说在程序内部就变回去了?如果是那样也可以前面加static,声明成静态变量,如static int a;但是如果你在这个函数以外也想使用这个函数,就象上面说的,声明成全局的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般是永久的配置存储最好写在磁盘上面,而不是存在内存中-关机就消失了。1:写注册表,使用操作注册表的API函数就可以了。下次运行读取配置就行。2:磁盘文件。可以是Ini文件(很常见),XML文件,CFG文件,实际上只要你自己能正确读写就可以啦。明白了没有?? 我的程序里有多个类,在一个类里面做打印设置,另一个类里面做打印预览和打印,每次我都重新得到打印机的DC,打印设置完了再做打印的时候得到的DC并不是我设置了之后的。我希望能在打印的时候得到打印设置好了的DC,怎么做? 现在我想用全局变量保存。还是有问题,打印机的东西那么多,我不知道该保存哪一个。比如从PAGESETUPDLG设置后可以得到一个DEVMODE 的句柄,我保存了这个句柄就可以了么?但是后面在打印预览的时候我需要用的是DEVEMODE 结构。句柄怎么转换成结构? SetPrinter(hPrinter,2,pPrinter,0);在什么情况下会出assert错?ATL: ERROR - Object deleted before window was destroyed 打印设置完了再做打印的时候得到的DC并不是我设置了之后的。???????????????????????类的实例难道没有保存状态的功能?可能是dc与类间的关系搞错了。 不是啦,我每次都是重新得到dc的,设置与打印是不同的函数,而且设置的时候根本就得不到打印DC。打印函数需要自己得到dc,跟设置就没有关系了。所以我希望在打印设置后保存设置内容,打印之前用打印设置的内容来设置一下打印机。现在前面没有问题,就是在打印中设置打印机的时候SetPrinter出错 不是。我在设置时候没有得到dc。现在保存设置在全局变量里面,然后打印的时候读取保存的变量,用来设置打印机。设置时候SetPrinter出错 在OnPrint()中用GetDC;再把保存不可以吗? 我在设置里面不能得到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_OUUFFER); memcpy(pDevMode,pPrintinfo->pDevMode,lNeeded); ret = DocumentProperties(m_hWnd,hPrinter,PrinterName,pDevMode,pDevMode,DUT_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 拒绝访问。是不是还有什么权限要设置? 自己把所有的东西存起来行吗? 虽然麻烦一点,我就是这么做的----------------- .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 pointstatic 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);}// staticLONG 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 changeBOOL 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 fieldsvoid 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() vc数据库和ADO的问题,就秒啊 COMMAND和UPDATE_COMMAND_UI区别 串口通讯中的流控制,CTS/RTS的使用,编程中应注意事项,有哪为做过这东西,进来说说啊 全局消息钩子拦截系统新建,改名,删除文件夹应该拦截哪个消息? 菜鸟请教:请大家讨论关于图形重绘的问题,留言者均有分,不够再加 一个网上两台机器通信的问题 LoadImage 10多MB 图片怎么不出来。 如何下载用realplayer播放的影音文件? 关于 Queued Components 讨论一下,为什么要有CTTI,真的很重要吗? 考MCSD证书有用吗? 谁给我关于各种图片文件的格式?在线等待
1:写注册表,使用操作注册表的API函数就可以了。下次运行读取配置就行。
2:磁盘文件。可以是Ini文件(很常见),XML文件,CFG文件,实际上只要你自己能正确读写就可以啦。
明白了没有??
我希望能在打印的时候得到打印设置好了的DC,怎么做?
还是有问题,打印机的东西那么多,我不知道该保存哪一个。
比如从PAGESETUPDLG设置后可以得到一个DEVMODE 的句柄,
我保存了这个句柄就可以了么?但是后面在打印预览的时候我
需要用的是DEVEMODE 结构。句柄怎么转换成结构?
SetPrinter(hPrinter,2,pPrinter,0);
在什么情况下会出assert错?
ATL: ERROR - Object deleted before window was destroyed
我就想把设置里面改动的东西保存下来。现在关键是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 拒绝访问。是不是还有什么权限要设置?
#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()