sesefeng
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2005-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1737回复:6

terrificskyfox请问

楼主#
更多 发布于:2003-07-07 21:15
十分感谢terrificskyfox的回答,可是在DEVMODE结构体中,我没有发现有private数据项,请问是不是将DEVMODE扩展呢,即增加新的数据成员,还有,“在打印的过程中利用这些数据”具体指那些函数呢?另外,我想增加自己的属性页,于是我写了如下代码到ExtDeviceModePropSheet:

HINSTANCE hInstCommon;
PROPSHEETPROC PSProc;
CREATEPROC CreateProc;
FARPROC InitProc;
PROPSHEETPAGE psp;
HPROPSHEETPAGE hpage;

if(((hInstCommon=LoadLibrary(\"COMMCTRL.DLL\")) < HINSTANCE_ERROR) ||
(!(PSProc=(PROPSHEETPROC)GetProcAddress(hInstCommon,
SHELL_PROPSHEET))) ||
(!(CreateProc=(CREATEPROC)GetProcAddress(hInstCommon,
SHELL_CREATEPAGE))) ||
(!(InitProc=GetProcAddress(hInstCommon,
COMMCTRL_INIT))))
{
MessageBox(hWnd, \"Hello\",\"Hello\", MB_OK);
}
InitProc();

_fmemset((LPSTR)&psp,0,sizeof(PROPSHEETPAGE));
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.hInstance = hInst;
psp.pszTemplate = MAKEINTRESOURCE(TEST1);
//psp.pszTitle = L\"Setup Dlg\";
psp.pfnDlgProc = procs;
psp.lParam = (LPARAM)lParam;
psp.pfnCallback = lpfnAdd;

if(hpage = CreateProc(&psp))
lpfnAdd(hpage,lParam);
return UniExtDeviceModePropSheet(hWnd, hInst, lpDevName, lpPort,dwReserved, lpfnAdd, lParam);

但是没有出现我自定义的属性页,为什么?还请指教!谢谢!



 
terrificskyfox
驱动小牛
驱动小牛
  • 注册日期2003-03-12
  • 最后登录2014-04-28
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望11点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-13 10:28
在98ddk的tty例子中和95ddk的hpplot例子中都有完整详细的代码,你可以先仔细查看一下

如果你只需要显示自己的属性页,不需要调用UniExtDeviceModePropSheet函数
只需要初始化一个PROPSHEETHEADER结构,然后用你的PSProc例程来生成属性页对话框

如果你要同时显示Unidriver和你自己提供的属性页,那你只需要先调用UniExtDeviceModePropSheet函数,然后用lpfnAdd添加你自己的属性页就可以了,你的代码中顺序错了

不过显示属性页的函数应该放在一个单独的函数中,因为只有在控制面板中单击你的打印机图标时系统才会调用ExtDeviceModePropSheet函数显示属性对话框,而在应用程序中却是调用ExtDeviceMode来显示的,因此放在一个单独的函数中然后在你的ExtDeviceMode和ExtDeviceModePropSheet中给定不同的mode来调用就总是可以得到想要的属性对话框

关于对DEVMODE结构的扩展,你可以看一下hpplot例子中的ENVIRONMENT结构,很简单
就是类似这样的一个结构
typedef struct _extdevmode
{
    DEVMODE dm;
    private....;
} EXTDEVMODE;
在DEVMODE结构的后面跟上你自己的数据然后把相应函数中的参数类型修改一下就可以了

DEVMODE的数据存储在注册表中,具体的键值好像是
HKLM_SYSTEM_CURRENTCONTROLSET_CONTROL_PRINT_PRINTER_your printer name
如果不对,你可以查一下default devmode找找看
处理的函数是DrvGetPrinterData和DrvSetPrinterData,具体的参数使用方法在msdn中说的不明白,你看一下hpplot例子中的devmode.c文件中的处理吧


[编辑 -  7/13/03 by  terrificskyfox]

[编辑 -  7/13/03 by  terrificskyfox]

[编辑 -  7/13/03 by  terrificskyfox]
sesefeng
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2005-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-13 21:31
十分感谢您的回答,我先按你提示来试试!以后还会有问题问你!另外,问一下,你要分吗,我300多吧。
terrificskyfox
驱动小牛
驱动小牛
  • 注册日期2003-03-12
  • 最后登录2014-04-28
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望11点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-15 17:10
呵呵,上来这段时间,还不知道分数到底有什么用,你愿意给就给点好了,来者不拒么:)
sesefeng
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2005-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-16 22:36
呵呵,我倒忘了怎么给分,是不是另开一个话题啊,请高人指点。
另外,terrificskyfox,我把你说的顺序改变了也没有出现属性页,是不是有其他问题啊,谢谢回答!
terrificskyfox
驱动小牛
驱动小牛
  • 注册日期2003-03-12
  • 最后登录2014-04-28
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望11点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-16 23:44
应该是没有问题的,你还是先仔细看看hpplot中devmode.c文件中的实现吧,自己研究最透彻,我这么给你讲难免有疏漏的问题
sesefeng
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2005-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-17 19:49
好吧,我再看看!
游客

返回顶部