Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
9e2b15da
Commit
9e2b15da
authored
Aug 02, 2003
by
Steven Edwards
Committed by
Alexandre Julliard
Aug 02, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split Win16/32 printer dialogs.
parent
4bc97ce8
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
700 additions
and
617 deletions
+700
-617
Makefile.in
dlls/commdlg/Makefile.in
+2
-1
printdlg.c
dlls/commdlg/printdlg.c
+11
-616
printdlg.h
dlls/commdlg/printdlg.h
+107
-0
printdlg16.c
dlls/commdlg/printdlg16.c
+580
-0
No files found.
dlls/commdlg/Makefile.in
View file @
9e2b15da
...
...
@@ -28,7 +28,8 @@ C_SRCS16 = \
colordlg16.c
\
filedlg16.c
\
finddlg.c
\
fontdlg16.c
fontdlg16.c
\
printdlg16.c
RC_SRCS
=
rsrc.rc
...
...
dlls/commdlg/printdlg.c
View file @
9e2b15da
...
...
@@ -43,73 +43,11 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
commdlg
);
#include "cdlg.h"
#include "printdlg.h"
/* This PRINTDLGA internal structure stores
* pointers to several throughout useful structures.
*
*/
typedef
struct
{
LPDEVMODEA
lpDevMode
;
struct
{
LPPRINTDLGA
lpPrintDlg
;
LPPRINTDLG16
lpPrintDlg16
;
}
dlg
;
LPPRINTER_INFO_2A
lpPrinterInfo
;
LPDRIVER_INFO_3A
lpDriverInfo
;
UINT
HelpMessageID
;
HICON
hCollateIcon
;
/* PrintDlg only */
HICON
hNoCollateIcon
;
/* PrintDlg only */
HICON
hPortraitIcon
;
/* PrintSetupDlg only */
HICON
hLandscapeIcon
;
/* PrintSetupDlg only */
HWND
hwndUpDown
;
}
PRINT_PTRA
;
typedef
struct
{
LPDEVMODEW
lpDevMode
;
struct
{
LPPRINTDLGW
lpPrintDlg
;
}
dlg
;
LPPRINTER_INFO_2W
lpPrinterInfo
;
LPDRIVER_INFO_3W
lpDriverInfo
;
UINT
HelpMessageID
;
HICON
hCollateIcon
;
/* PrintDlg only */
HICON
hNoCollateIcon
;
/* PrintDlg only */
HICON
hPortraitIcon
;
/* PrintSetupDlg only */
HICON
hLandscapeIcon
;
/* PrintSetupDlg only */
HWND
hwndUpDown
;
}
PRINT_PTRW
;
/* Debugging info */
static
struct
pd_flags
{
DWORD
flag
;
LPSTR
name
;
}
pd_flags
[]
=
{
{
PD_SELECTION
,
"PD_SELECTION "
},
{
PD_PAGENUMS
,
"PD_PAGENUMS "
},
{
PD_NOSELECTION
,
"PD_NOSELECTION "
},
{
PD_NOPAGENUMS
,
"PD_NOPAGENUMS "
},
{
PD_COLLATE
,
"PD_COLLATE "
},
{
PD_PRINTTOFILE
,
"PD_PRINTTOFILE "
},
{
PD_PRINTSETUP
,
"PD_PRINTSETUP "
},
{
PD_NOWARNING
,
"PD_NOWARNING "
},
{
PD_RETURNDC
,
"PD_RETURNDC "
},
{
PD_RETURNIC
,
"PD_RETURNIC "
},
{
PD_RETURNDEFAULT
,
"PD_RETURNDEFAULT "
},
{
PD_SHOWHELP
,
"PD_SHOWHELP "
},
{
PD_ENABLEPRINTHOOK
,
"PD_ENABLEPRINTHOOK "
},
{
PD_ENABLESETUPHOOK
,
"PD_ENABLESETUPHOOK "
},
{
PD_ENABLEPRINTTEMPLATE
,
"PD_ENABLEPRINTTEMPLATE "
},
{
PD_ENABLESETUPTEMPLATE
,
"PD_ENABLESETUPTEMPLATE "
},
{
PD_ENABLEPRINTTEMPLATEHANDLE
,
"PD_ENABLEPRINTTEMPLATEHANDLE "
},
{
PD_ENABLESETUPTEMPLATEHANDLE
,
"PD_ENABLESETUPTEMPLATEHANDLE "
},
{
PD_USEDEVMODECOPIES
,
"PD_USEDEVMODECOPIES[ANDCOLLATE] "
},
{
PD_DISABLEPRINTTOFILE
,
"PD_DISABLEPRINTTOFILE "
},
{
PD_HIDEPRINTTOFILE
,
"PD_HIDEPRINTTOFILE "
},
{
PD_NONETWORKBUTTON
,
"PD_NONETWORKBUTTON "
},
{
-
1
,
NULL
}
};
/* Yes these constants are the same, but we're just copying win98 */
#define UPDOWN_ID 0x270f
#define MAX_COPIES 9999
/* Debugging info */
static
struct
pd_flags
psd_flags
[]
=
{
...
...
@@ -132,10 +70,6 @@ static struct pd_flags psd_flags[] = {
{
-
1
,
NULL
}
};
/* Yes these constants are the same, but we're just copying win98 */
#define UPDOWN_ID 0x270f
#define MAX_COPIES 9999
/***********************************************************************
* PRINTDLG_GetDefaultPrinterName
*
...
...
@@ -145,7 +79,7 @@ static struct pd_flags psd_flags[] = {
*
* Returns TRUE on success else FALSE
*/
static
BOOL
PRINTDLG_GetDefaultPrinterNameA
(
LPSTR
buf
,
DWORD
len
)
BOOL
PRINTDLG_GetDefaultPrinterNameA
(
LPSTR
buf
,
DWORD
len
)
{
char
*
ptr
;
...
...
@@ -190,7 +124,7 @@ static BOOL PRINTDLG_GetDefaultPrinterNameW(LPWSTR buf, DWORD len)
*
* Returns TRUE on success else FALSE
*/
static
BOOL
PRINTDLG_OpenDefaultPrinter
(
HANDLE
*
hprn
)
BOOL
PRINTDLG_OpenDefaultPrinter
(
HANDLE
*
hprn
)
{
char
buf
[
260
];
BOOL
res
;
...
...
@@ -215,7 +149,7 @@ static BOOL PRINTDLG_OpenDefaultPrinter(HANDLE *hprn)
*
* Returns number of printers added to list.
*/
static
INT
PRINTDLG_SetUpPrinterListComboA
(
HWND
hDlg
,
UINT
id
,
LPCSTR
name
)
INT
PRINTDLG_SetUpPrinterListComboA
(
HWND
hDlg
,
UINT
id
,
LPCSTR
name
)
{
DWORD
needed
,
num
;
INT
i
;
...
...
@@ -374,50 +308,6 @@ static BOOL PRINTDLG_CreateDevNamesW(HGLOBAL *hmem, LPCWSTR DeviceDriverName,
return
TRUE
;
}
static
BOOL
PRINTDLG_CreateDevNames16
(
HGLOBAL16
*
hmem
,
char
*
DeviceDriverName
,
char
*
DeviceName
,
char
*
OutputPort
)
{
long
size
;
char
*
pDevNamesSpace
;
char
*
pTempPtr
;
LPDEVNAMES
lpDevNames
;
char
buf
[
260
];
size
=
strlen
(
DeviceDriverName
)
+
1
+
strlen
(
DeviceName
)
+
1
+
strlen
(
OutputPort
)
+
1
+
sizeof
(
DEVNAMES
);
if
(
*
hmem
)
*
hmem
=
GlobalReAlloc16
(
*
hmem
,
size
,
GMEM_MOVEABLE
);
else
*
hmem
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
size
);
if
(
*
hmem
==
0
)
return
FALSE
;
pDevNamesSpace
=
GlobalLock16
(
*
hmem
);
lpDevNames
=
(
LPDEVNAMES
)
pDevNamesSpace
;
pTempPtr
=
pDevNamesSpace
+
sizeof
(
DEVNAMES
);
strcpy
(
pTempPtr
,
DeviceDriverName
);
lpDevNames
->
wDriverOffset
=
pTempPtr
-
pDevNamesSpace
;
pTempPtr
+=
strlen
(
DeviceDriverName
)
+
1
;
strcpy
(
pTempPtr
,
DeviceName
);
lpDevNames
->
wDeviceOffset
=
pTempPtr
-
pDevNamesSpace
;
pTempPtr
+=
strlen
(
DeviceName
)
+
1
;
strcpy
(
pTempPtr
,
OutputPort
);
lpDevNames
->
wOutputOffset
=
pTempPtr
-
pDevNamesSpace
;
PRINTDLG_GetDefaultPrinterNameA
(
buf
,
sizeof
(
buf
));
lpDevNames
->
wDefault
=
(
strcmp
(
buf
,
DeviceName
)
==
0
)
?
1
:
0
;
GlobalUnlock16
(
*
hmem
);
return
TRUE
;
}
/***********************************************************************
* PRINTDLG_UpdatePrintDlg [internal]
*
...
...
@@ -1005,7 +895,7 @@ static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, LPPRINTER_INFO_2W pi)
* PRINTDLG_ChangePrinter
*
*/
static
BOOL
PRINTDLG_ChangePrinterA
(
HWND
hDlg
,
char
*
name
,
BOOL
PRINTDLG_ChangePrinterA
(
HWND
hDlg
,
char
*
name
,
PRINT_PTRA
*
PrintStructures
)
{
LPPRINTDLGA
lppd
=
PrintStructures
->
dlg
.
lpPrintDlg
;
...
...
@@ -1540,127 +1430,10 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, WPARAM wParam,
return
TRUE
;
}
/***********************************************************************
* PRINTDLG_WMInitDialog [internal]
*/
static
LRESULT
PRINTDLG_WMInitDialog16
(
HWND
hDlg
,
WPARAM
wParam
,
PRINT_PTRA
*
PrintStructures
)
{
LPPRINTDLG16
lppd
=
PrintStructures
->
dlg
.
lpPrintDlg16
;
DEVNAMES
*
pdn
;
DEVMODEA
*
pdm
;
char
*
name
=
NULL
;
UINT
comboID
=
(
lppd
->
Flags
&
PD_PRINTSETUP
)
?
cmb1
:
cmb4
;
/* load Collate ICONs */
PrintStructures
->
hCollateIcon
=
LoadIconA
(
COMDLG32_hInstance
,
"PD32_COLLATE"
);
PrintStructures
->
hNoCollateIcon
=
LoadIconA
(
COMDLG32_hInstance
,
"PD32_NOCOLLATE"
);
if
(
PrintStructures
->
hCollateIcon
==
0
||
PrintStructures
->
hNoCollateIcon
==
0
)
{
ERR
(
"no icon in resourcefile
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
EndDialog
(
hDlg
,
FALSE
);
}
/* load Paper Orientation ICON */
/* FIXME: not implemented yet */
/*
* if lppd->Flags PD_SHOWHELP is specified, a HELPMESGSTRING message
* must be registered and the Help button must be shown.
*/
if
(
lppd
->
Flags
&
PD_SHOWHELP
)
{
if
((
PrintStructures
->
HelpMessageID
=
RegisterWindowMessageA
(
HELPMSGSTRINGA
))
==
0
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_REGISTERMSGFAIL
);
return
FALSE
;
}
}
else
PrintStructures
->
HelpMessageID
=
0
;
if
(
!
(
lppd
->
Flags
&
PD_PRINTSETUP
))
{
/* We have a print quality combo box. What shall we do? */
if
(
GetDlgItem
(
hDlg
,
cmb1
))
{
char
buf
[
20
];
FIXME
(
"Print quality only displaying currently.
\n
"
);
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
pdm
)
{
switch
(
pdm
->
dmPrintQuality
)
{
case
DMRES_HIGH
:
strcpy
(
buf
,
"High"
);
break
;
case
DMRES_MEDIUM
:
strcpy
(
buf
,
"Medium"
);
break
;
case
DMRES_LOW
:
strcpy
(
buf
,
"Low"
);
break
;
case
DMRES_DRAFT
:
strcpy
(
buf
,
"Draft"
);
break
;
case
0
:
strcpy
(
buf
,
"Default"
);
break
;
default
:
sprintf
(
buf
,
"%ddpi"
,
pdm
->
dmPrintQuality
);
break
;
}
GlobalUnlock16
(
lppd
->
hDevMode
);
}
else
strcpy
(
buf
,
"Default"
);
SendDlgItemMessageA
(
hDlg
,
cmb1
,
CB_ADDSTRING
,
0
,(
LPARAM
)
buf
);
SendDlgItemMessageA
(
hDlg
,
cmb1
,
CB_SETCURSEL
,
0
,
0
);
EnableWindow
(
GetDlgItem
(
hDlg
,
cmb1
),
FALSE
);
}
}
/* FIXME: I allow more freedom than either Win95 or WinNT,
* which do not agree to what errors should be thrown or not
* in case nToPage or nFromPage is out-of-range.
*/
if
(
lppd
->
nMaxPage
<
lppd
->
nMinPage
)
lppd
->
nMaxPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nMinPage
==
lppd
->
nMaxPage
)
lppd
->
Flags
|=
PD_NOPAGENUMS
;
if
(
lppd
->
nToPage
<
lppd
->
nMinPage
)
lppd
->
nToPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nToPage
>
lppd
->
nMaxPage
)
lppd
->
nToPage
=
lppd
->
nMaxPage
;
if
(
lppd
->
nFromPage
<
lppd
->
nMinPage
)
lppd
->
nFromPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nFromPage
>
lppd
->
nMaxPage
)
lppd
->
nFromPage
=
lppd
->
nMaxPage
;
/* If the printer combo box is in the dialog, fill it */
if
(
GetDlgItem
(
hDlg
,
comboID
))
{
/* Fill Combobox
*/
pdn
=
GlobalLock16
(
lppd
->
hDevNames
);
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
pdn
)
name
=
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
;
else
if
(
pdm
)
name
=
pdm
->
dmDeviceName
;
PRINTDLG_SetUpPrinterListComboA
(
hDlg
,
comboID
,
name
);
if
(
pdm
)
GlobalUnlock16
(
lppd
->
hDevMode
);
if
(
pdn
)
GlobalUnlock16
(
lppd
->
hDevNames
);
/* Now find selected printer and update rest of dlg */
name
=
HeapAlloc
(
GetProcessHeap
(),
0
,
256
);
if
(
GetDlgItemTextA
(
hDlg
,
comboID
,
name
,
255
))
PRINTDLG_ChangePrinterA
(
hDlg
,
name
,
PrintStructures
);
}
else
{
/* else just use default printer */
char
name
[
200
];
BOOL
ret
=
PRINTDLG_GetDefaultPrinterNameA
(
name
,
sizeof
(
name
));
if
(
ret
)
PRINTDLG_ChangePrinterA
(
hDlg
,
name
,
PrintStructures
);
else
FIXME
(
"No default printer found, expect problems!
\n
"
);
}
HeapFree
(
GetProcessHeap
(),
0
,
name
);
return
TRUE
;
}
/***********************************************************************
* PRINTDLG_WMCommand [internal]
*/
static
LRESULT
PRINTDLG_WMCommandA
(
HWND
hDlg
,
WPARAM
wParam
,
LRESULT
PRINTDLG_WMCommandA
(
HWND
hDlg
,
WPARAM
wParam
,
LPARAM
lParam
,
PRINT_PTRA
*
PrintStructures
)
{
LPPRINTDLGA
lppd
=
PrintStructures
->
dlg
.
lpPrintDlg
;
...
...
@@ -1718,6 +1491,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
}
break
;
#if 0
case psh1: /* Print Setup */
{
PRINTDLG16 pdlg;
...
...
@@ -1734,6 +1508,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
break;
}
break;
#endif
case
psh2
:
/* Properties button */
{
HANDLE
hPrinter
;
...
...
@@ -2088,55 +1863,6 @@ INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam,
return
res
;
}
/************************************************************
*
* PRINTDLG_Get16TemplateFrom32 [Internal]
* Generates a 16 bits template from the Wine 32 bits resource
*
*/
static
HGLOBAL16
PRINTDLG_Get16TemplateFrom32
(
char
*
PrintResourceName
)
{
HRSRC
hResInfo
;
HGLOBAL
hDlgTmpl32
;
LPCVOID
template32
;
DWORD
size
;
HGLOBAL16
hGlobal16
;
LPVOID
template
;
if
(
!
(
hResInfo
=
FindResourceA
(
COMDLG32_hInstance
,
PrintResourceName
,
RT_DIALOGA
)))
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_FINDRESFAILURE
);
return
0
;
}
if
(
!
(
hDlgTmpl32
=
LoadResource
(
COMDLG32_hInstance
,
hResInfo
))
||
!
(
template32
=
LockResource
(
hDlgTmpl32
)))
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
return
0
;
}
size
=
SizeofResource
(
COMDLG32_hInstance
,
hResInfo
);
hGlobal16
=
GlobalAlloc16
(
0
,
size
);
if
(
!
hGlobal16
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_MEMALLOCFAILURE
);
ERR
(
"alloc failure for %ld bytes
\n
"
,
size
);
return
0
;
}
template
=
GlobalLock16
(
hGlobal16
);
if
(
!
template
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_MEMLOCKFAILURE
);
ERR
(
"global lock failure for %x handle
\n
"
,
hGlobal16
);
GlobalFree16
(
hGlobal16
);
return
0
;
}
ConvertDialog32To16
((
LPVOID
)
template32
,
size
,
(
LPVOID
)
template
);
GlobalUnlock16
(
hGlobal16
);
return
hGlobal16
;
}
/************************************************************
*
* PRINTDLG_GetDlgTemplate
...
...
@@ -2210,42 +1936,6 @@ static HGLOBAL PRINTDLG_GetDlgTemplateW(PRINTDLGW *lppd)
return
hDlgTmpl
;
}
/************************************************************
*
* PRINTDLG_GetDlgTemplate
*
*/
static
HGLOBAL16
PRINTDLG_GetDlgTemplate16
(
PRINTDLG16
*
lppd
)
{
HGLOBAL16
hDlgTmpl
,
hResInfo
;
if
(
lppd
->
Flags
&
PD_PRINTSETUP
)
{
if
(
lppd
->
Flags
&
PD_ENABLESETUPTEMPLATEHANDLE
)
{
hDlgTmpl
=
lppd
->
hSetupTemplate
;
}
else
if
(
lppd
->
Flags
&
PD_ENABLESETUPTEMPLATE
)
{
hResInfo
=
FindResource16
(
lppd
->
hInstance
,
MapSL
(
lppd
->
lpSetupTemplateName
),
RT_DIALOGA
);
hDlgTmpl
=
LoadResource16
(
lppd
->
hInstance
,
hResInfo
);
}
else
{
hDlgTmpl
=
PRINTDLG_Get16TemplateFrom32
(
"PRINT32_SETUP"
);
}
}
else
{
if
(
lppd
->
Flags
&
PD_ENABLEPRINTTEMPLATEHANDLE
)
{
hDlgTmpl
=
lppd
->
hPrintTemplate
;
}
else
if
(
lppd
->
Flags
&
PD_ENABLEPRINTTEMPLATE
)
{
hResInfo
=
FindResource16
(
lppd
->
hInstance
,
MapSL
(
lppd
->
lpPrintTemplateName
),
RT_DIALOGA
);
hDlgTmpl
=
LoadResource16
(
lppd
->
hInstance
,
hResInfo
);
}
else
{
hDlgTmpl
=
PRINTDLG_Get16TemplateFrom32
(
"PRINT32"
);
}
}
return
hDlgTmpl
;
}
/***********************************************************************
*
* PRINTDLG_CreateDC
...
...
@@ -2293,27 +1983,6 @@ static BOOL PRINTDLG_CreateDCW(LPPRINTDLGW lppd)
return
lppd
->
hDC
?
TRUE
:
FALSE
;
}
static
BOOL
PRINTDLG_CreateDC16
(
LPPRINTDLG16
lppd
)
{
DEVNAMES
*
pdn
=
GlobalLock16
(
lppd
->
hDevNames
);
DEVMODEA
*
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
lppd
->
Flags
&
PD_RETURNDC
)
{
lppd
->
hDC
=
HDC_16
(
CreateDCA
((
char
*
)
pdn
+
pdn
->
wDriverOffset
,
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
,
(
char
*
)
pdn
+
pdn
->
wOutputOffset
,
pdm
));
}
else
if
(
lppd
->
Flags
&
PD_RETURNIC
)
{
lppd
->
hDC
=
HDC_16
(
CreateICA
((
char
*
)
pdn
+
pdn
->
wDriverOffset
,
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
,
(
char
*
)
pdn
+
pdn
->
wOutputOffset
,
pdm
));
}
GlobalUnlock16
(
lppd
->
hDevNames
);
GlobalUnlock16
(
lppd
->
hDevMode
);
return
lppd
->
hDC
?
TRUE
:
FALSE
;
}
/***********************************************************************
* PrintDlgA (COMDLG32.@)
*
...
...
@@ -2645,188 +2314,6 @@ BOOL WINAPI PrintDlgW(
}
/***********************************************************************
* PrintDlg (COMMDLG.20)
*
* Displays the the PRINT dialog box, which enables the user to specify
* specific properties of the print job.
*
* RETURNS
* nonzero if the user pressed the OK button
* zero if the user cancelled the window or an error occurred
*
* BUGS
* * calls up to the 32-bit versions of the Dialogs, which look different
* * Customizing is *not* implemented.
*/
BOOL16
WINAPI
PrintDlg16
(
LPPRINTDLG16
lppd
/* [in/out] ptr to PRINTDLG struct */
)
{
BOOL
bRet
=
FALSE
;
LPVOID
ptr
;
HINSTANCE16
hInst
=
GetWindowWord
(
HWND_32
(
lppd
->
hwndOwner
),
GWL_HINSTANCE
);
if
(
TRACE_ON
(
commdlg
))
{
char
flagstr
[
1000
]
=
""
;
struct
pd_flags
*
pflag
=
pd_flags
;
for
(
;
pflag
->
name
;
pflag
++
)
{
if
(
lppd
->
Flags
&
pflag
->
flag
)
strcat
(
flagstr
,
pflag
->
name
);
}
TRACE
(
"(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x
\n
"
"pp. %d-%d, min p %d, max p %d, copies %d, hinst %08x
\n
"
"flags %08lx (%s)
\n
"
,
lppd
,
lppd
->
hwndOwner
,
lppd
->
hDevMode
,
lppd
->
hDevNames
,
lppd
->
nFromPage
,
lppd
->
nToPage
,
lppd
->
nMinPage
,
lppd
->
nMaxPage
,
lppd
->
nCopies
,
lppd
->
hInstance
,
lppd
->
Flags
,
flagstr
);
}
if
(
lppd
->
lStructSize
!=
sizeof
(
PRINTDLG16
))
{
ERR
(
"structure size (%ld/%d)
\n
"
,
lppd
->
lStructSize
,
sizeof
(
PRINTDLG16
));
COMDLG32_SetCommDlgExtendedError
(
CDERR_STRUCTSIZE
);
return
FALSE
;
}
if
(
lppd
->
Flags
&
PD_RETURNDEFAULT
)
{
PRINTER_INFO_2A
*
pbuf
;
DRIVER_INFO_3A
*
dbuf
;
HANDLE
hprn
;
DWORD
needed
;
if
(
lppd
->
hDevMode
||
lppd
->
hDevNames
)
{
WARN
(
"hDevMode or hDevNames non-zero for PD_RETURNDEFAULT
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
PDERR_RETDEFFAILURE
);
return
FALSE
;
}
if
(
!
PRINTDLG_OpenDefaultPrinter
(
&
hprn
))
{
WARN
(
"Can't find default printer
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
PDERR_NODEFAULTPRN
);
return
FALSE
;
}
GetPrinterA
(
hprn
,
2
,
NULL
,
0
,
&
needed
);
pbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
GetPrinterA
(
hprn
,
2
,
(
LPBYTE
)
pbuf
,
needed
,
&
needed
);
GetPrinterDriverA
(
hprn
,
NULL
,
3
,
NULL
,
0
,
&
needed
);
dbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
if
(
!
GetPrinterDriverA
(
hprn
,
NULL
,
3
,
(
LPBYTE
)
dbuf
,
needed
,
&
needed
))
{
ERR
(
"GetPrinterDriverA failed for %s, le %ld, fix your config!
\n
"
,
pbuf
->
pPrinterName
,
GetLastError
());
COMDLG32_SetCommDlgExtendedError
(
PDERR_RETDEFFAILURE
);
return
FALSE
;
}
ClosePrinter
(
hprn
);
PRINTDLG_CreateDevNames16
(
&
(
lppd
->
hDevNames
),
dbuf
->
pDriverPath
,
pbuf
->
pPrinterName
,
pbuf
->
pPortName
);
lppd
->
hDevMode
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
pbuf
->
pDevMode
->
dmSize
+
pbuf
->
pDevMode
->
dmDriverExtra
);
ptr
=
GlobalLock16
(
lppd
->
hDevMode
);
memcpy
(
ptr
,
pbuf
->
pDevMode
,
pbuf
->
pDevMode
->
dmSize
+
pbuf
->
pDevMode
->
dmDriverExtra
);
GlobalUnlock16
(
lppd
->
hDevMode
);
HeapFree
(
GetProcessHeap
(),
0
,
pbuf
);
HeapFree
(
GetProcessHeap
(),
0
,
dbuf
);
bRet
=
TRUE
;
}
else
{
HGLOBAL16
hDlgTmpl
;
PRINT_PTRA
*
PrintStructures
;
/* load Dialog resources,
* depending on Flags indicates Print32 or Print32_setup dialog
*/
hDlgTmpl
=
PRINTDLG_GetDlgTemplate16
(
lppd
);
if
(
!
hDlgTmpl
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
return
FALSE
;
}
PrintStructures
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
PRINT_PTRA
));
PrintStructures
->
dlg
.
lpPrintDlg16
=
lppd
;
PrintStructures
->
dlg
.
lpPrintDlg
=
(
LPPRINTDLGA
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
PRINTDLGA
));
#define CVAL(x) PrintStructures->dlg.lpPrintDlg->x = lppd->x;
#define MVAL(x) PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x);
CVAL
(
Flags
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hwndOwner
=
HWND_32
(
lppd
->
hwndOwner
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hDC
=
HDC_32
(
lppd
->
hDC
);
CVAL
(
nFromPage
);
CVAL
(
nToPage
);
CVAL
(
nMinPage
);
CVAL
(
nMaxPage
);
CVAL
(
nCopies
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hInstance
=
HINSTANCE_32
(
lppd
->
hInstance
);
CVAL
(
lCustData
);
MVAL
(
lpPrintTemplateName
);
MVAL
(
lpSetupTemplateName
);
/* Don't copy rest, it is 16 bit specific */
#undef MVAL
#undef CVAL
PrintStructures
->
lpDevMode
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
DEVMODEA
));
/* and create & process the dialog .
* -1 is failure, 0 is broken hwnd, everything else is ok.
*/
bRet
=
(
0
<
DialogBoxIndirectParam16
(
hInst
,
hDlgTmpl
,
lppd
->
hwndOwner
,
(
DLGPROC16
)
GetProcAddress16
(
GetModuleHandle16
(
"COMMDLG"
),(
LPCSTR
)
21
),
(
LPARAM
)
PrintStructures
)
);
if
(
!
PrintStructures
->
lpPrinterInfo
)
bRet
=
FALSE
;
if
(
bRet
)
{
DEVMODEA
*
lpdm
=
PrintStructures
->
lpDevMode
,
*
lpdmReturn
;
PRINTER_INFO_2A
*
pi
=
PrintStructures
->
lpPrinterInfo
;
DRIVER_INFO_3A
*
di
=
PrintStructures
->
lpDriverInfo
;
if
(
lppd
->
hDevMode
==
0
)
{
TRACE
(
" No hDevMode yet... Need to create my own
\n
"
);
lppd
->
hDevMode
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
);
}
else
{
WORD
locks
;
if
((
locks
=
(
GlobalFlags16
(
lppd
->
hDevMode
)
&
GMEM_LOCKCOUNT
)))
{
WARN
(
"hDevMode has %d locks on it. Unlocking it now
\n
"
,
locks
);
while
(
locks
--
)
{
GlobalUnlock16
(
lppd
->
hDevMode
);
TRACE
(
"Now got %d locks
\n
"
,
locks
);
}
}
lppd
->
hDevMode
=
GlobalReAlloc16
(
lppd
->
hDevMode
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
,
GMEM_MOVEABLE
);
}
lpdmReturn
=
GlobalLock16
(
lppd
->
hDevMode
);
memcpy
(
lpdmReturn
,
lpdm
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
);
if
(
lppd
->
hDevNames
!=
0
)
{
WORD
locks
;
if
((
locks
=
(
GlobalFlags16
(
lppd
->
hDevNames
)
&
GMEM_LOCKCOUNT
)))
{
WARN
(
"hDevNames has %d locks on it. Unlocking it now
\n
"
,
locks
);
while
(
locks
--
)
GlobalUnlock16
(
lppd
->
hDevNames
);
}
}
PRINTDLG_CreateDevNames16
(
&
(
lppd
->
hDevNames
),
di
->
pDriverPath
,
pi
->
pPrinterName
,
pi
->
pPortName
);
GlobalUnlock16
(
lppd
->
hDevMode
);
}
if
(
!
(
lppd
->
Flags
&
(
PD_ENABLESETUPTEMPLATEHANDLE
|
PD_ENABLESETUPTEMPLATE
)))
GlobalFree16
(
hDlgTmpl
);
/* created from the 32 bits resource */
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpDevMode
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpPrinterInfo
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpDriverInfo
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
);
}
if
(
bRet
&&
(
lppd
->
Flags
&
PD_RETURNDC
||
lppd
->
Flags
&
PD_RETURNIC
))
bRet
=
PRINTDLG_CreateDC16
(
lppd
);
TRACE
(
"exit! (%d)
\n
"
,
bRet
);
return
bRet
;
}
/***********************************************************************
*
* PageSetupDlg
* rad1 - portrait
...
...
@@ -3461,98 +2948,6 @@ BOOL WINAPI PageSetupDlgW(LPPAGESETUPDLGW setupdlg) {
return
bRet
;
}
/**********************************************************************
*
* 16 bit commdlg
*/
/***********************************************************************
* PrintDlgProc (COMMDLG.21)
*/
BOOL16
CALLBACK
PrintDlgProc16
(
HWND16
hDlg16
,
UINT16
uMsg
,
WPARAM16
wParam
,
LPARAM
lParam
)
{
HWND
hDlg
=
HWND_32
(
hDlg16
);
PRINT_PTRA
*
PrintStructures
;
BOOL16
res
=
FALSE
;
if
(
uMsg
!=
WM_INITDIALOG
)
{
PrintStructures
=
(
PRINT_PTRA
*
)
GetPropA
(
hDlg
,
"__WINE_PRINTDLGDATA"
);
if
(
!
PrintStructures
)
return
FALSE
;
}
else
{
PrintStructures
=
(
PRINT_PTRA
*
)
lParam
;
SetPropA
(
hDlg
,
"__WINE_PRINTDLGDATA"
,
PrintStructures
);
res
=
PRINTDLG_WMInitDialog16
(
hDlg
,
wParam
,
PrintStructures
);
if
(
PrintStructures
->
dlg
.
lpPrintDlg16
->
Flags
&
PD_ENABLEPRINTHOOK
)
{
res
=
CallWindowProc16
(
(
WNDPROC16
)
PrintStructures
->
dlg
.
lpPrintDlg16
->
lpfnPrintHook
,
hDlg16
,
uMsg
,
wParam
,
(
LPARAM
)
PrintStructures
->
dlg
.
lpPrintDlg16
);
}
return
res
;
}
if
(
PrintStructures
->
dlg
.
lpPrintDlg16
->
Flags
&
PD_ENABLEPRINTHOOK
)
{
res
=
CallWindowProc16
(
(
WNDPROC16
)
PrintStructures
->
dlg
.
lpPrintDlg16
->
lpfnPrintHook
,
hDlg16
,
uMsg
,
wParam
,
lParam
);
if
(
LOWORD
(
res
))
return
res
;
}
switch
(
uMsg
)
{
case
WM_COMMAND
:
{
/* We need to map those for the 32bit window procedure, compare
* with 32Ato16 mapper in winproc.c
*/
return
PRINTDLG_WMCommandA
(
hDlg
,
MAKEWPARAM
(
wParam
,
HIWORD
(
lParam
)),
LOWORD
(
lParam
),
PrintStructures
);
}
case
WM_DESTROY
:
DestroyIcon
(
PrintStructures
->
hCollateIcon
);
DestroyIcon
(
PrintStructures
->
hNoCollateIcon
);
/* FIXME: don't forget to delete the paper orientation icons here! */
return
FALSE
;
}
return
res
;
}
/***********************************************************************
* PrintSetupDlgProc (COMMDLG.22)
*/
BOOL16
CALLBACK
PrintSetupDlgProc16
(
HWND16
hWnd16
,
UINT16
wMsg
,
WPARAM16
wParam
,
LPARAM
lParam
)
{
HWND
hWnd
=
HWND_32
(
hWnd16
);
switch
(
wMsg
)
{
case
WM_INITDIALOG
:
TRACE
(
"WM_INITDIALOG lParam=%08lX
\n
"
,
lParam
);
ShowWindow
(
hWnd
,
SW_SHOWNORMAL
);
return
(
TRUE
);
case
WM_COMMAND
:
switch
(
wParam
)
{
case
IDOK
:
EndDialog
(
hWnd
,
TRUE
);
return
(
TRUE
);
case
IDCANCEL
:
EndDialog
(
hWnd
,
FALSE
);
return
(
TRUE
);
}
return
(
FALSE
);
}
return
FALSE
;
}
/***********************************************************************
* PrintDlgExA (COMDLG32.@)
*/
...
...
dlls/commdlg/printdlg.h
0 → 100644
View file @
9e2b15da
/*
* COMMDLG - Print Dialog
*
* Copyright 1994 Martin Ayotte
* Copyright 1996 Albrecht Kleine
* Copyright 1999 Klaas van Gend
* Copyright 2000 Huw D M Davies
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _WINE_PRINTDLG_H
#define _WINE_PRINTDLG_H
/* This PRINTDLGA internal structure stores
* pointers to several throughout useful structures.
*
*/
typedef
struct
{
LPDEVMODEA
lpDevMode
;
struct
{
LPPRINTDLGA
lpPrintDlg
;
LPPRINTDLG16
lpPrintDlg16
;
}
dlg
;
LPPRINTER_INFO_2A
lpPrinterInfo
;
LPDRIVER_INFO_3A
lpDriverInfo
;
UINT
HelpMessageID
;
HICON
hCollateIcon
;
/* PrintDlg only */
HICON
hNoCollateIcon
;
/* PrintDlg only */
HICON
hPortraitIcon
;
/* PrintSetupDlg only */
HICON
hLandscapeIcon
;
/* PrintSetupDlg only */
HWND
hwndUpDown
;
}
PRINT_PTRA
;
typedef
struct
{
LPDEVMODEW
lpDevMode
;
struct
{
LPPRINTDLGW
lpPrintDlg
;
}
dlg
;
LPPRINTER_INFO_2W
lpPrinterInfo
;
LPDRIVER_INFO_3W
lpDriverInfo
;
UINT
HelpMessageID
;
HICON
hCollateIcon
;
/* PrintDlg only */
HICON
hNoCollateIcon
;
/* PrintDlg only */
HICON
hPortraitIcon
;
/* PrintSetupDlg only */
HICON
hLandscapeIcon
;
/* PrintSetupDlg only */
HWND
hwndUpDown
;
}
PRINT_PTRW
;
/* Debugging info */
static
struct
pd_flags
{
DWORD
flag
;
LPSTR
name
;
}
pd_flags
[]
=
{
{
PD_SELECTION
,
"PD_SELECTION "
},
{
PD_PAGENUMS
,
"PD_PAGENUMS "
},
{
PD_NOSELECTION
,
"PD_NOSELECTION "
},
{
PD_NOPAGENUMS
,
"PD_NOPAGENUMS "
},
{
PD_COLLATE
,
"PD_COLLATE "
},
{
PD_PRINTTOFILE
,
"PD_PRINTTOFILE "
},
{
PD_PRINTSETUP
,
"PD_PRINTSETUP "
},
{
PD_NOWARNING
,
"PD_NOWARNING "
},
{
PD_RETURNDC
,
"PD_RETURNDC "
},
{
PD_RETURNIC
,
"PD_RETURNIC "
},
{
PD_RETURNDEFAULT
,
"PD_RETURNDEFAULT "
},
{
PD_SHOWHELP
,
"PD_SHOWHELP "
},
{
PD_ENABLEPRINTHOOK
,
"PD_ENABLEPRINTHOOK "
},
{
PD_ENABLESETUPHOOK
,
"PD_ENABLESETUPHOOK "
},
{
PD_ENABLEPRINTTEMPLATE
,
"PD_ENABLEPRINTTEMPLATE "
},
{
PD_ENABLESETUPTEMPLATE
,
"PD_ENABLESETUPTEMPLATE "
},
{
PD_ENABLEPRINTTEMPLATEHANDLE
,
"PD_ENABLEPRINTTEMPLATEHANDLE "
},
{
PD_ENABLESETUPTEMPLATEHANDLE
,
"PD_ENABLESETUPTEMPLATEHANDLE "
},
{
PD_USEDEVMODECOPIES
,
"PD_USEDEVMODECOPIES[ANDCOLLATE] "
},
{
PD_DISABLEPRINTTOFILE
,
"PD_DISABLEPRINTTOFILE "
},
{
PD_HIDEPRINTTOFILE
,
"PD_HIDEPRINTTOFILE "
},
{
PD_NONETWORKBUTTON
,
"PD_NONETWORKBUTTON "
},
{
-
1
,
NULL
}
};
/* Internal Functions
* Do not Export to other applications or dlls
*/
BOOL
PRINTDLG_GetDefaultPrinterNameA
(
LPSTR
buf
,
DWORD
len
);
INT
PRINTDLG_SetUpPrinterListComboA
(
HWND
hDlg
,
UINT
id
,
LPCSTR
name
);
BOOL
PRINTDLG_ChangePrinterA
(
HWND
hDlg
,
char
*
name
,
PRINT_PTRA
*
PrintStructures
);
BOOL
PRINTDLG_OpenDefaultPrinter
(
HANDLE
*
hprn
);
LRESULT
PRINTDLG_WMCommandA
(
HWND
hDlg
,
WPARAM
wParam
,
LPARAM
lParam
,
PRINT_PTRA
*
PrintStructures
);
#endif
/* _WINE_PRINTDLG_H */
dlls/commdlg/printdlg16.c
0 → 100644
View file @
9e2b15da
/*
* COMMDLG - Print Dialog
*
* Copyright 1994 Martin Ayotte
* Copyright 1996 Albrecht Kleine
* Copyright 1999 Klaas van Gend
* Copyright 2000 Huw D M Davies
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "wine/wingdi16.h"
#include "winuser.h"
#include "wine/winuser16.h"
#include "commdlg.h"
#include "dlgs.h"
#include "wine/debug.h"
#include "cderr.h"
#include "winspool.h"
#include "winerror.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
commdlg
);
#include "cdlg.h"
#include "printdlg.h"
static
BOOL
PRINTDLG_CreateDevNames16
(
HGLOBAL16
*
hmem
,
char
*
DeviceDriverName
,
char
*
DeviceName
,
char
*
OutputPort
)
{
long
size
;
char
*
pDevNamesSpace
;
char
*
pTempPtr
;
LPDEVNAMES
lpDevNames
;
char
buf
[
260
];
size
=
strlen
(
DeviceDriverName
)
+
1
+
strlen
(
DeviceName
)
+
1
+
strlen
(
OutputPort
)
+
1
+
sizeof
(
DEVNAMES
);
if
(
*
hmem
)
*
hmem
=
GlobalReAlloc16
(
*
hmem
,
size
,
GMEM_MOVEABLE
);
else
*
hmem
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
size
);
if
(
*
hmem
==
0
)
return
FALSE
;
pDevNamesSpace
=
GlobalLock16
(
*
hmem
);
lpDevNames
=
(
LPDEVNAMES
)
pDevNamesSpace
;
pTempPtr
=
pDevNamesSpace
+
sizeof
(
DEVNAMES
);
strcpy
(
pTempPtr
,
DeviceDriverName
);
lpDevNames
->
wDriverOffset
=
pTempPtr
-
pDevNamesSpace
;
pTempPtr
+=
strlen
(
DeviceDriverName
)
+
1
;
strcpy
(
pTempPtr
,
DeviceName
);
lpDevNames
->
wDeviceOffset
=
pTempPtr
-
pDevNamesSpace
;
pTempPtr
+=
strlen
(
DeviceName
)
+
1
;
strcpy
(
pTempPtr
,
OutputPort
);
lpDevNames
->
wOutputOffset
=
pTempPtr
-
pDevNamesSpace
;
PRINTDLG_GetDefaultPrinterNameA
(
buf
,
sizeof
(
buf
));
lpDevNames
->
wDefault
=
(
strcmp
(
buf
,
DeviceName
)
==
0
)
?
1
:
0
;
GlobalUnlock16
(
*
hmem
);
return
TRUE
;
}
/***********************************************************************
* PRINTDLG_WMInitDialog [internal]
*/
static
LRESULT
PRINTDLG_WMInitDialog16
(
HWND
hDlg
,
WPARAM
wParam
,
PRINT_PTRA
*
PrintStructures
)
{
LPPRINTDLG16
lppd
=
PrintStructures
->
dlg
.
lpPrintDlg16
;
DEVNAMES
*
pdn
;
DEVMODEA
*
pdm
;
char
*
name
=
NULL
;
UINT
comboID
=
(
lppd
->
Flags
&
PD_PRINTSETUP
)
?
cmb1
:
cmb4
;
/* load Collate ICONs */
PrintStructures
->
hCollateIcon
=
LoadIconA
(
COMDLG32_hInstance
,
"PD32_COLLATE"
);
PrintStructures
->
hNoCollateIcon
=
LoadIconA
(
COMDLG32_hInstance
,
"PD32_NOCOLLATE"
);
if
(
PrintStructures
->
hCollateIcon
==
0
||
PrintStructures
->
hNoCollateIcon
==
0
)
{
ERR
(
"no icon in resourcefile
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
EndDialog
(
hDlg
,
FALSE
);
}
/* load Paper Orientation ICON */
/* FIXME: not implemented yet */
/*
* if lppd->Flags PD_SHOWHELP is specified, a HELPMESGSTRING message
* must be registered and the Help button must be shown.
*/
if
(
lppd
->
Flags
&
PD_SHOWHELP
)
{
if
((
PrintStructures
->
HelpMessageID
=
RegisterWindowMessageA
(
HELPMSGSTRINGA
))
==
0
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_REGISTERMSGFAIL
);
return
FALSE
;
}
}
else
PrintStructures
->
HelpMessageID
=
0
;
if
(
!
(
lppd
->
Flags
&
PD_PRINTSETUP
))
{
/* We have a print quality combo box. What shall we do? */
if
(
GetDlgItem
(
hDlg
,
cmb1
))
{
char
buf
[
20
];
FIXME
(
"Print quality only displaying currently.
\n
"
);
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
pdm
)
{
switch
(
pdm
->
dmPrintQuality
)
{
case
DMRES_HIGH
:
strcpy
(
buf
,
"High"
);
break
;
case
DMRES_MEDIUM
:
strcpy
(
buf
,
"Medium"
);
break
;
case
DMRES_LOW
:
strcpy
(
buf
,
"Low"
);
break
;
case
DMRES_DRAFT
:
strcpy
(
buf
,
"Draft"
);
break
;
case
0
:
strcpy
(
buf
,
"Default"
);
break
;
default
:
sprintf
(
buf
,
"%ddpi"
,
pdm
->
dmPrintQuality
);
break
;
}
GlobalUnlock16
(
lppd
->
hDevMode
);
}
else
strcpy
(
buf
,
"Default"
);
SendDlgItemMessageA
(
hDlg
,
cmb1
,
CB_ADDSTRING
,
0
,(
LPARAM
)
buf
);
SendDlgItemMessageA
(
hDlg
,
cmb1
,
CB_SETCURSEL
,
0
,
0
);
EnableWindow
(
GetDlgItem
(
hDlg
,
cmb1
),
FALSE
);
}
}
/* FIXME: I allow more freedom than either Win95 or WinNT,
* which do not agree to what errors should be thrown or not
* in case nToPage or nFromPage is out-of-range.
*/
if
(
lppd
->
nMaxPage
<
lppd
->
nMinPage
)
lppd
->
nMaxPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nMinPage
==
lppd
->
nMaxPage
)
lppd
->
Flags
|=
PD_NOPAGENUMS
;
if
(
lppd
->
nToPage
<
lppd
->
nMinPage
)
lppd
->
nToPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nToPage
>
lppd
->
nMaxPage
)
lppd
->
nToPage
=
lppd
->
nMaxPage
;
if
(
lppd
->
nFromPage
<
lppd
->
nMinPage
)
lppd
->
nFromPage
=
lppd
->
nMinPage
;
if
(
lppd
->
nFromPage
>
lppd
->
nMaxPage
)
lppd
->
nFromPage
=
lppd
->
nMaxPage
;
/* If the printer combo box is in the dialog, fill it */
if
(
GetDlgItem
(
hDlg
,
comboID
))
{
/* Fill Combobox
*/
pdn
=
GlobalLock16
(
lppd
->
hDevNames
);
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
pdn
)
name
=
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
;
else
if
(
pdm
)
name
=
pdm
->
dmDeviceName
;
PRINTDLG_SetUpPrinterListComboA
(
hDlg
,
comboID
,
name
);
if
(
pdm
)
GlobalUnlock16
(
lppd
->
hDevMode
);
if
(
pdn
)
GlobalUnlock16
(
lppd
->
hDevNames
);
/* Now find selected printer and update rest of dlg */
name
=
HeapAlloc
(
GetProcessHeap
(),
0
,
256
);
if
(
GetDlgItemTextA
(
hDlg
,
comboID
,
name
,
255
))
PRINTDLG_ChangePrinterA
(
hDlg
,
name
,
PrintStructures
);
}
else
{
/* else just use default printer */
char
name
[
200
];
BOOL
ret
=
PRINTDLG_GetDefaultPrinterNameA
(
name
,
sizeof
(
name
));
if
(
ret
)
PRINTDLG_ChangePrinterA
(
hDlg
,
name
,
PrintStructures
);
else
FIXME
(
"No default printer found, expect problems!
\n
"
);
}
HeapFree
(
GetProcessHeap
(),
0
,
name
);
return
TRUE
;
}
/************************************************************
*
* PRINTDLG_Get16TemplateFrom32 [Internal]
* Generates a 16 bits template from the Wine 32 bits resource
*
*/
static
HGLOBAL16
PRINTDLG_Get16TemplateFrom32
(
char
*
PrintResourceName
)
{
HRSRC
hResInfo
;
HGLOBAL
hDlgTmpl32
;
LPCVOID
template32
;
DWORD
size
;
HGLOBAL16
hGlobal16
;
LPVOID
template
;
if
(
!
(
hResInfo
=
FindResourceA
(
COMDLG32_hInstance
,
PrintResourceName
,
RT_DIALOGA
)))
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_FINDRESFAILURE
);
return
0
;
}
if
(
!
(
hDlgTmpl32
=
LoadResource
(
COMDLG32_hInstance
,
hResInfo
))
||
!
(
template32
=
LockResource
(
hDlgTmpl32
)))
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
return
0
;
}
size
=
SizeofResource
(
COMDLG32_hInstance
,
hResInfo
);
hGlobal16
=
GlobalAlloc16
(
0
,
size
);
if
(
!
hGlobal16
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_MEMALLOCFAILURE
);
ERR
(
"alloc failure for %ld bytes
\n
"
,
size
);
return
0
;
}
template
=
GlobalLock16
(
hGlobal16
);
if
(
!
template
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_MEMLOCKFAILURE
);
ERR
(
"global lock failure for %x handle
\n
"
,
hGlobal16
);
GlobalFree16
(
hGlobal16
);
return
0
;
}
ConvertDialog32To16
((
LPVOID
)
template32
,
size
,
(
LPVOID
)
template
);
GlobalUnlock16
(
hGlobal16
);
return
hGlobal16
;
}
static
BOOL
PRINTDLG_CreateDC16
(
LPPRINTDLG16
lppd
)
{
DEVNAMES
*
pdn
=
GlobalLock16
(
lppd
->
hDevNames
);
DEVMODEA
*
pdm
=
GlobalLock16
(
lppd
->
hDevMode
);
if
(
lppd
->
Flags
&
PD_RETURNDC
)
{
lppd
->
hDC
=
HDC_16
(
CreateDCA
((
char
*
)
pdn
+
pdn
->
wDriverOffset
,
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
,
(
char
*
)
pdn
+
pdn
->
wOutputOffset
,
pdm
));
}
else
if
(
lppd
->
Flags
&
PD_RETURNIC
)
{
lppd
->
hDC
=
HDC_16
(
CreateICA
((
char
*
)
pdn
+
pdn
->
wDriverOffset
,
(
char
*
)
pdn
+
pdn
->
wDeviceOffset
,
(
char
*
)
pdn
+
pdn
->
wOutputOffset
,
pdm
));
}
GlobalUnlock16
(
lppd
->
hDevNames
);
GlobalUnlock16
(
lppd
->
hDevMode
);
return
lppd
->
hDC
?
TRUE
:
FALSE
;
}
/************************************************************
*
* PRINTDLG_GetDlgTemplate
*
*/
static
HGLOBAL16
PRINTDLG_GetDlgTemplate16
(
PRINTDLG16
*
lppd
)
{
HGLOBAL16
hDlgTmpl
,
hResInfo
;
if
(
lppd
->
Flags
&
PD_PRINTSETUP
)
{
if
(
lppd
->
Flags
&
PD_ENABLESETUPTEMPLATEHANDLE
)
{
hDlgTmpl
=
lppd
->
hSetupTemplate
;
}
else
if
(
lppd
->
Flags
&
PD_ENABLESETUPTEMPLATE
)
{
hResInfo
=
FindResource16
(
lppd
->
hInstance
,
MapSL
(
lppd
->
lpSetupTemplateName
),
RT_DIALOGA
);
hDlgTmpl
=
LoadResource16
(
lppd
->
hInstance
,
hResInfo
);
}
else
{
hDlgTmpl
=
PRINTDLG_Get16TemplateFrom32
(
"PRINT32_SETUP"
);
}
}
else
{
if
(
lppd
->
Flags
&
PD_ENABLEPRINTTEMPLATEHANDLE
)
{
hDlgTmpl
=
lppd
->
hPrintTemplate
;
}
else
if
(
lppd
->
Flags
&
PD_ENABLEPRINTTEMPLATE
)
{
hResInfo
=
FindResource16
(
lppd
->
hInstance
,
MapSL
(
lppd
->
lpPrintTemplateName
),
RT_DIALOGA
);
hDlgTmpl
=
LoadResource16
(
lppd
->
hInstance
,
hResInfo
);
}
else
{
hDlgTmpl
=
PRINTDLG_Get16TemplateFrom32
(
"PRINT32"
);
}
}
return
hDlgTmpl
;
}
/***********************************************************************
* PrintDlg (COMMDLG.20)
*
* Displays the the PRINT dialog box, which enables the user to specify
* specific properties of the print job.
*
* RETURNS
* nonzero if the user pressed the OK button
* zero if the user cancelled the window or an error occurred
*
* BUGS
* * calls up to the 32-bit versions of the Dialogs, which look different
* * Customizing is *not* implemented.
*/
BOOL16
WINAPI
PrintDlg16
(
LPPRINTDLG16
lppd
/* [in/out] ptr to PRINTDLG struct */
)
{
BOOL
bRet
=
FALSE
;
LPVOID
ptr
;
HINSTANCE16
hInst
=
GetWindowWord
(
HWND_32
(
lppd
->
hwndOwner
),
GWL_HINSTANCE
);
if
(
TRACE_ON
(
commdlg
))
{
char
flagstr
[
1000
]
=
""
;
struct
pd_flags
*
pflag
=
pd_flags
;
for
(
;
pflag
->
name
;
pflag
++
)
{
if
(
lppd
->
Flags
&
pflag
->
flag
)
strcat
(
flagstr
,
pflag
->
name
);
}
TRACE
(
"(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x
\n
"
"pp. %d-%d, min p %d, max p %d, copies %d, hinst %08x
\n
"
"flags %08lx (%s)
\n
"
,
lppd
,
lppd
->
hwndOwner
,
lppd
->
hDevMode
,
lppd
->
hDevNames
,
lppd
->
nFromPage
,
lppd
->
nToPage
,
lppd
->
nMinPage
,
lppd
->
nMaxPage
,
lppd
->
nCopies
,
lppd
->
hInstance
,
lppd
->
Flags
,
flagstr
);
}
if
(
lppd
->
lStructSize
!=
sizeof
(
PRINTDLG16
))
{
ERR
(
"structure size (%ld/%d)
\n
"
,
lppd
->
lStructSize
,
sizeof
(
PRINTDLG16
));
COMDLG32_SetCommDlgExtendedError
(
CDERR_STRUCTSIZE
);
return
FALSE
;
}
if
(
lppd
->
Flags
&
PD_RETURNDEFAULT
)
{
PRINTER_INFO_2A
*
pbuf
;
DRIVER_INFO_3A
*
dbuf
;
HANDLE
hprn
;
DWORD
needed
;
if
(
lppd
->
hDevMode
||
lppd
->
hDevNames
)
{
WARN
(
"hDevMode or hDevNames non-zero for PD_RETURNDEFAULT
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
PDERR_RETDEFFAILURE
);
return
FALSE
;
}
if
(
!
PRINTDLG_OpenDefaultPrinter
(
&
hprn
))
{
WARN
(
"Can't find default printer
\n
"
);
COMDLG32_SetCommDlgExtendedError
(
PDERR_NODEFAULTPRN
);
return
FALSE
;
}
GetPrinterA
(
hprn
,
2
,
NULL
,
0
,
&
needed
);
pbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
GetPrinterA
(
hprn
,
2
,
(
LPBYTE
)
pbuf
,
needed
,
&
needed
);
GetPrinterDriverA
(
hprn
,
NULL
,
3
,
NULL
,
0
,
&
needed
);
dbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
needed
);
if
(
!
GetPrinterDriverA
(
hprn
,
NULL
,
3
,
(
LPBYTE
)
dbuf
,
needed
,
&
needed
))
{
ERR
(
"GetPrinterDriverA failed for %s, le %ld, fix your config!
\n
"
,
pbuf
->
pPrinterName
,
GetLastError
());
COMDLG32_SetCommDlgExtendedError
(
PDERR_RETDEFFAILURE
);
return
FALSE
;
}
ClosePrinter
(
hprn
);
PRINTDLG_CreateDevNames16
(
&
(
lppd
->
hDevNames
),
dbuf
->
pDriverPath
,
pbuf
->
pPrinterName
,
pbuf
->
pPortName
);
lppd
->
hDevMode
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
pbuf
->
pDevMode
->
dmSize
+
pbuf
->
pDevMode
->
dmDriverExtra
);
ptr
=
GlobalLock16
(
lppd
->
hDevMode
);
memcpy
(
ptr
,
pbuf
->
pDevMode
,
pbuf
->
pDevMode
->
dmSize
+
pbuf
->
pDevMode
->
dmDriverExtra
);
GlobalUnlock16
(
lppd
->
hDevMode
);
HeapFree
(
GetProcessHeap
(),
0
,
pbuf
);
HeapFree
(
GetProcessHeap
(),
0
,
dbuf
);
bRet
=
TRUE
;
}
else
{
HGLOBAL16
hDlgTmpl
;
PRINT_PTRA
*
PrintStructures
;
/* load Dialog resources,
* depending on Flags indicates Print32 or Print32_setup dialog
*/
hDlgTmpl
=
PRINTDLG_GetDlgTemplate16
(
lppd
);
if
(
!
hDlgTmpl
)
{
COMDLG32_SetCommDlgExtendedError
(
CDERR_LOADRESFAILURE
);
return
FALSE
;
}
PrintStructures
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
PRINT_PTRA
));
PrintStructures
->
dlg
.
lpPrintDlg16
=
lppd
;
PrintStructures
->
dlg
.
lpPrintDlg
=
(
LPPRINTDLGA
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
PRINTDLGA
));
#define CVAL(x) PrintStructures->dlg.lpPrintDlg->x = lppd->x;
#define MVAL(x) PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x);
CVAL
(
Flags
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hwndOwner
=
HWND_32
(
lppd
->
hwndOwner
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hDC
=
HDC_32
(
lppd
->
hDC
);
CVAL
(
nFromPage
);
CVAL
(
nToPage
);
CVAL
(
nMinPage
);
CVAL
(
nMaxPage
);
CVAL
(
nCopies
);
PrintStructures
->
dlg
.
lpPrintDlg
->
hInstance
=
HINSTANCE_32
(
lppd
->
hInstance
);
CVAL
(
lCustData
);
MVAL
(
lpPrintTemplateName
);
MVAL
(
lpSetupTemplateName
);
/* Don't copy rest, it is 16 bit specific */
#undef MVAL
#undef CVAL
PrintStructures
->
lpDevMode
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
DEVMODEA
));
/* and create & process the dialog .
* -1 is failure, 0 is broken hwnd, everything else is ok.
*/
bRet
=
(
0
<
DialogBoxIndirectParam16
(
hInst
,
hDlgTmpl
,
lppd
->
hwndOwner
,
(
DLGPROC16
)
GetProcAddress16
(
GetModuleHandle16
(
"COMMDLG"
),(
LPCSTR
)
21
),
(
LPARAM
)
PrintStructures
)
);
if
(
!
PrintStructures
->
lpPrinterInfo
)
bRet
=
FALSE
;
if
(
bRet
)
{
DEVMODEA
*
lpdm
=
PrintStructures
->
lpDevMode
,
*
lpdmReturn
;
PRINTER_INFO_2A
*
pi
=
PrintStructures
->
lpPrinterInfo
;
DRIVER_INFO_3A
*
di
=
PrintStructures
->
lpDriverInfo
;
if
(
lppd
->
hDevMode
==
0
)
{
TRACE
(
" No hDevMode yet... Need to create my own
\n
"
);
lppd
->
hDevMode
=
GlobalAlloc16
(
GMEM_MOVEABLE
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
);
}
else
{
WORD
locks
;
if
((
locks
=
(
GlobalFlags16
(
lppd
->
hDevMode
)
&
GMEM_LOCKCOUNT
)))
{
WARN
(
"hDevMode has %d locks on it. Unlocking it now
\n
"
,
locks
);
while
(
locks
--
)
{
GlobalUnlock16
(
lppd
->
hDevMode
);
TRACE
(
"Now got %d locks
\n
"
,
locks
);
}
}
lppd
->
hDevMode
=
GlobalReAlloc16
(
lppd
->
hDevMode
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
,
GMEM_MOVEABLE
);
}
lpdmReturn
=
GlobalLock16
(
lppd
->
hDevMode
);
memcpy
(
lpdmReturn
,
lpdm
,
lpdm
->
dmSize
+
lpdm
->
dmDriverExtra
);
if
(
lppd
->
hDevNames
!=
0
)
{
WORD
locks
;
if
((
locks
=
(
GlobalFlags16
(
lppd
->
hDevNames
)
&
GMEM_LOCKCOUNT
)))
{
WARN
(
"hDevNames has %d locks on it. Unlocking it now
\n
"
,
locks
);
while
(
locks
--
)
GlobalUnlock16
(
lppd
->
hDevNames
);
}
}
PRINTDLG_CreateDevNames16
(
&
(
lppd
->
hDevNames
),
di
->
pDriverPath
,
pi
->
pPrinterName
,
pi
->
pPortName
);
GlobalUnlock16
(
lppd
->
hDevMode
);
}
if
(
!
(
lppd
->
Flags
&
(
PD_ENABLESETUPTEMPLATEHANDLE
|
PD_ENABLESETUPTEMPLATE
)))
GlobalFree16
(
hDlgTmpl
);
/* created from the 32 bits resource */
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpDevMode
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpPrinterInfo
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
->
lpDriverInfo
);
HeapFree
(
GetProcessHeap
(),
0
,
PrintStructures
);
}
if
(
bRet
&&
(
lppd
->
Flags
&
PD_RETURNDC
||
lppd
->
Flags
&
PD_RETURNIC
))
bRet
=
PRINTDLG_CreateDC16
(
lppd
);
TRACE
(
"exit! (%d)
\n
"
,
bRet
);
return
bRet
;
}
/**********************************************************************
*
* 16 bit commdlg
*/
/***********************************************************************
* PrintDlgProc (COMMDLG.21)
*/
BOOL16
CALLBACK
PrintDlgProc16
(
HWND16
hDlg16
,
UINT16
uMsg
,
WPARAM16
wParam
,
LPARAM
lParam
)
{
HWND
hDlg
=
HWND_32
(
hDlg16
);
PRINT_PTRA
*
PrintStructures
;
BOOL16
res
=
FALSE
;
if
(
uMsg
!=
WM_INITDIALOG
)
{
PrintStructures
=
(
PRINT_PTRA
*
)
GetPropA
(
hDlg
,
"__WINE_PRINTDLGDATA"
);
if
(
!
PrintStructures
)
return
FALSE
;
}
else
{
PrintStructures
=
(
PRINT_PTRA
*
)
lParam
;
SetPropA
(
hDlg
,
"__WINE_PRINTDLGDATA"
,
PrintStructures
);
res
=
PRINTDLG_WMInitDialog16
(
hDlg
,
wParam
,
PrintStructures
);
if
(
PrintStructures
->
dlg
.
lpPrintDlg16
->
Flags
&
PD_ENABLEPRINTHOOK
)
{
res
=
CallWindowProc16
(
(
WNDPROC16
)
PrintStructures
->
dlg
.
lpPrintDlg16
->
lpfnPrintHook
,
hDlg16
,
uMsg
,
wParam
,
(
LPARAM
)
PrintStructures
->
dlg
.
lpPrintDlg16
);
}
return
res
;
}
if
(
PrintStructures
->
dlg
.
lpPrintDlg16
->
Flags
&
PD_ENABLEPRINTHOOK
)
{
res
=
CallWindowProc16
(
(
WNDPROC16
)
PrintStructures
->
dlg
.
lpPrintDlg16
->
lpfnPrintHook
,
hDlg16
,
uMsg
,
wParam
,
lParam
);
if
(
LOWORD
(
res
))
return
res
;
}
switch
(
uMsg
)
{
case
WM_COMMAND
:
{
/* We need to map those for the 32bit window procedure, compare
* with 32Ato16 mapper in winproc.c
*/
return
PRINTDLG_WMCommandA
(
hDlg
,
MAKEWPARAM
(
wParam
,
HIWORD
(
lParam
)),
LOWORD
(
lParam
),
PrintStructures
);
}
case
WM_DESTROY
:
DestroyIcon
(
PrintStructures
->
hCollateIcon
);
DestroyIcon
(
PrintStructures
->
hNoCollateIcon
);
/* FIXME: don't forget to delete the paper orientation icons here! */
return
FALSE
;
}
return
res
;
}
/***********************************************************************
* PrintSetupDlgProc (COMMDLG.22)
*/
BOOL16
CALLBACK
PrintSetupDlgProc16
(
HWND16
hWnd16
,
UINT16
wMsg
,
WPARAM16
wParam
,
LPARAM
lParam
)
{
HWND
hWnd
=
HWND_32
(
hWnd16
);
switch
(
wMsg
)
{
case
WM_INITDIALOG
:
TRACE
(
"WM_INITDIALOG lParam=%08lX
\n
"
,
lParam
);
ShowWindow
(
hWnd
,
SW_SHOWNORMAL
);
return
(
TRUE
);
case
WM_COMMAND
:
switch
(
wParam
)
{
case
IDOK
:
EndDialog
(
hWnd
,
TRUE
);
return
(
TRUE
);
case
IDCANCEL
:
EndDialog
(
hWnd
,
FALSE
);
return
(
TRUE
);
}
return
(
FALSE
);
}
return
FALSE
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment