Что такое логические единицы и экстенты?

Тема в разделе "WASM.WIN32", создана пользователем hellobody, 6 июн 2008.

  1. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    Добрый день, всем!
    Может кто подскажет, как работать с этими функциями...

    invoke SaveDC,hdcPrint
    invoke SetMapMode, hdcPrint, MM_ISOTROPIC
    invoke SetWindowExtEx, hdcPrint, 1000, 1000, NULL
    invoke SetViewportExtEx, hdcPrint, 800, -600, NULL
    invoke SetViewportOrgEx, hdcPrint, 800 , 600, NULL

    это функции которые принимают участие в программировании принтера...

    тект печатаю, кружочки печатаю, прямоугольнички - криво, но печатаю, а вот картинки - не получается... с пом. BitBlt на монитор вывожу, а на принтер не получается...
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Можно также пользовать MM_TEXT. Тогда на всех форматах бумаги картинки будут равного размера + отпадёт необходимость в SetWindowExtEx и SetViewportExtEx.
    А как вы вызываете BitBlt? Раз рисуются кружочки/квадратики, значит "на выходе" с DC проблем нет. Проблемы, вестимо, с тем DC, откуда вы копируете.
     
  3. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    вот мой корявенький исходник...
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. include \masm32\include\gdi32.inc
    9. include \masm32\include\comdlg32.inc
    10.  
    11.  
    12.  
    13. includelib \masm32\lib\user32.lib
    14. includelib \masm32\lib\kernel32.lib
    15. includelib \masm32\lib\gdi32.lib
    16. includelib \masm32\lib\comdlg32.lib
    17.  
    18. RGB macro red,green,blue
    19.            xor eax,eax
    20.  
    21.            mov ah,blue
    22.            shl eax,8
    23.            mov ah,green
    24.            mov al,red
    25.  
    26.    endm
    27.  
    28.  
    29.  
    30. .const
    31.  
    32. IDB_MAIN   equ 555
    33.  
    34. IDC_EDIT    equ 3000
    35. IDC_BUTTON  equ 3001
    36.  
    37. IDC_EXIT    equ 3002
    38. IDM_OPEN    equ 1
    39. IDM_SAVE    equ 2
    40. IDM_EXIT    equ 3
    41. IDM_WINBLT  equ 4
    42.  
    43. MAXSIZE     equ 260
    44. MEMSIZE     equ 65535
    45.  
    46. EditID  equ     1
    47. EditID2 equ     2
    48. EditID3 equ     3
    49. EditID4 equ     4
    50. EditID5 equ     5
    51. EditID6 equ     6
    52. EditID7 equ     7
    53. EditID8 equ     8
    54. EditID9 equ     9
    55. EditIDa equ     10
    56. EditIDb equ     11
    57. EditIDc equ     12
    58. EditIDd equ     13
    59. EditIDe equ     14
    60. EditIDf equ     15
    61.  
    62.  
    63.  
    64. .data
    65.  
    66.  
    67. ClassName db "DLGCLASS",0
    68. MenuName db "MyMenu", 0
    69. EditClass   db  "edit", 0
    70. DlgName db "MyDialog",0
    71. AppName db "Приём выдача гарантийного товара",0
    72. FontName db "script",0
    73.  
    74. DocName db "Facked Print!",0
    75. PrinterName db "\\KASSA\HP Photosmart 8000 Series",0
    76. HelloPrinter db "Hello, Printer!",0
    77.  
    78.  
    79. Num db "запись №",0
    80. NameClient db "ФИО клиента",0
    81. BuyDate db "дата покупки",0
    82. GoingDate db "дата отправки на СЦ",0
    83. DateToday db "дата на момент приёма",0
    84. Variety db "наименование",0
    85. Model db "модель",0
    86. SerialNum db "серийный номер",0
    87. Diagnosis db "диагноз",0
    88. Equipment db "комплектация",0
    89. State db "состояние",0
    90. MobilePhoneNum db "телефон моб.",0
    91. HomePhone db "телефон дом.",0
    92. Address db "адрес",0
    93. WarrantyPeriod db "срок гарант. обслуживания",0
    94.  
    95. ofn   OPENFILENAME <>
    96. docinf DOCINFO <>
    97. FilterString db "All Files",0,"*.*",0
    98.              db "Text Files",0,"*.txt",0,0
    99. buffer db MAXSIZE dup(0)
    100.  
    101. .data?
    102. hInstance HINSTANCE ?
    103. CommandLine LPSTR ?
    104. hFile HANDLE ?
    105. hMemory DWORD ?
    106. pMemory DWORD ?
    107. tempMemory DWORD ?
    108. SizeReadWrite DWORD ?
    109. temp DWORD ?
    110. hBitmap dd ?
    111.  
    112.  
    113.  
    114. hwndEdit HWND ?
    115. hwndEdit2 HWND ?
    116. hwndEdit3 HWND ?
    117. hwndEdit4 HWND ?
    118. hwndEdit5 HWND ?
    119. hwndEdit6 HWND ?
    120. hwndEdit7 HWND ?
    121. hwndEdit8 HWND ?
    122. hwndEdit9 HWND ?
    123. hwndEdita HWND ?
    124. hwndEditb HWND ?
    125. hwndEditc HWND ?
    126. hwndEditd HWND ?
    127. hwndEdite HWND ?
    128. hwndEditf HWND ?
    129.  
    130. hdcPrint HDC ?
    131.  
    132. cxClient DWORD ?
    133. cyClient DWORD ?
    134. xx DWORD ?
    135. yy DWORD ?
    136. yyy DWORD ?
    137.  
    138. .code
    139. start:
    140.     invoke GetModuleHandle,NULL
    141.     mov  hInstance,eax
    142.     invoke GetCommandLine
    143.     mov CommandLine,eax
    144.     invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
    145.     invoke ExitProcess, eax
    146.  
    147. WinMain proc hInst: HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
    148.     LOCAL wc:WNDCLASSEX
    149.     LOCAL msg:MSG
    150.     LOCAL hDlg:HWND
    151.  
    152.     mov wc.cbSize, SIZEOF WNDCLASSEX
    153.     mov wc.style, CS_HREDRAW or CS_VREDRAW
    154.     mov wc.lpfnWndProc, OFFSET WndProc
    155.     mov wc.cbClsExtra, NULL
    156.     mov wc.cbWndExtra, DLGWINDOWEXTRA
    157.     push hInst
    158.     pop wc.hInstance
    159.     mov wc.hbrBackground, COLOR_BTNFACE+1
    160.     mov wc.lpszMenuName, OFFSET MenuName
    161.     mov wc.lpszClassName, OFFSET ClassName
    162.     invoke LoadIcon, NULL, IDI_APPLICATION
    163.     mov wc.hIcon, eax
    164.     mov wc.hIconSm, eax
    165.     invoke LoadCursor, NULL, IDC_ARROW
    166.     mov wc.hCursor, eax
    167.     invoke RegisterClassEx, addr wc
    168.     invoke CreateDialogParam, hInstance, ADDR DlgName, NULL, NULL, NULL
    169.     mov hDlg,eax
    170.     invoke GetDlgItem, hDlg, IDC_EDIT
    171.     invoke SetFocus, eax
    172.     invoke ShowWindow, hDlg, SW_SHOWNORMAL
    173.     invoke UpdateWindow, hDlg
    174.     .WHILE TRUE
    175.         invoke GetMessage, ADDR msg, NULL, 0, 0
    176.         .BREAK .IF(!eax)
    177.         invoke IsDialogMessage, hDlg, ADDR msg
    178.         .if eax==FALSE
    179.         invoke TranslateMessage, ADDR msg
    180.         invoke DispatchMessage, ADDR msg
    181.     .endif
    182.     .ENDW
    183.     mov eax,msg.wParam
    184.     ret
    185. WinMain endp
    186.  
    187. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    188.    
    189.     LOCAL hdc:HDC          
    190.     LOCAL ps:PAINTSTRUCT
    191.     LOCAL hfont:HFONT
    192.     LOCAL hMemDC:HDC
    193.     LOCAL rect:RECT
    194.    
    195.    
    196.     .if uMsg==WM_CREATE
    197.         invoke SetDlgItemText, hWnd, IDC_EDIT, ADDR AppName
    198.  
    199.  
    200.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,40,525,17,hWnd, EditID,hInstance, NULL
    201.         mov hwndEdit, eax      
    202.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,80,525,17,hWnd, EditID2,hInstance, NULL
    203.         mov hwndEdit2, eax 
    204.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,120,525,17,hWnd, EditID3,hInstance, NULL
    205.         mov hwndEdit3, eax 
    206.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,160,525,17,hWnd, EditID4,hInstance, NULL
    207.         mov hwndEdit4, eax 
    208.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,200,525,17,hWnd, EditID5,hInstance, NULL
    209.         mov hwndEdit5, eax 
    210.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,240,525,17,hWnd, EditID6,hInstance, NULL
    211.         mov hwndEdit6, eax     
    212.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,280,525,17,hWnd, EditID7,hInstance, NULL
    213.         mov hwndEdit7, eax 
    214.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,320,525,17,hWnd, EditID8,hInstance, NULL
    215.         mov hwndEdit8, eax 
    216.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,360,525,17,hWnd, EditID9,hInstance, NULL
    217.         mov hwndEdit9, eax 
    218.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,400,525,17,hWnd, EditIDa,hInstance, NULL
    219.         mov hwndEdita, eax 
    220.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,440,525,17,hWnd, EditIDb,hInstance, NULL
    221.         mov hwndEditb, eax 
    222.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,480,525,17,hWnd, EditIDc,hInstance, NULL
    223.         mov hwndEditc, eax 
    224.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,520,525,17,hWnd, EditIDd,hInstance, NULL
    225.         mov hwndEditd, eax 
    226.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,560,525,17,hWnd, EditIDe,hInstance, NULL
    227.         mov hwndEdite, eax 
    228.         invoke CreateWindowEx, NULL, ADDR EditClass, NULL, WS_VISIBLE or WS_CHILD or ES_LEFT,250,600,525,17,hWnd, EditIDf,hInstance, NULL
    229.         mov hwndEditf, eax 
    230.  
    231.         invoke SetFocus, hwndEdit
    232.  
    233.         mov ofn.lStructSize,SIZEOF ofn
    234.         push hWnd
    235.         pop  ofn.hWndOwner
    236.         push hInstance
    237.         pop  ofn.hInstance
    238.         mov  ofn.lpstrFilter, OFFSET FilterString
    239.         mov  ofn.lpstrFile, OFFSET buffer
    240.         mov  ofn.nMaxFile,MAXSIZE
    241.    
    242.            
    243.         mov docinf.cbSize,SIZEOF docinf
    244.         mov docinf.lpszDocName, OFFSET DocName
    245.         mov docinf.lpszOutput, NULL
    246.        
    247.  
    248.        
    249.         invoke CreateDC, NULL, OFFSET PrinterName, NULL, NULL
    250.         mov hdcPrint, eax
    251.                  
    252.                    
    253.            
    254.  
    255.     .elseif uMsg==WM_DESTROY
    256.         invoke PostQuitMessage, NULL
    257.        
    258.     .elseif uMsg==WM_SIZE
    259.         mov eax, lParam
    260.         mov cxClient, eax
    261.         mov eax, wParam
    262.         mov cyClient, eax
    263.        
    264.     .elseif uMsg==WM_PAINT
    265.         invoke BeginPaint,hWnd, ADDR ps
    266.         mov    hdc,eax
    267.        
    268.                
    269.         RGB 0,0,0
    270.         invoke SetTextColor,hdc,eax
    271.  
    272.         RGB 210,210,210
    273.         invoke SetBkColor,hdc,eax
    274.  
    275.         invoke TextOut,hdc,30,40,ADDR Num,SIZEOF Num-1
    276.         invoke TextOut,hdc,30,80,ADDR NameClient,SIZEOF NameClient-1
    277.         invoke TextOut,hdc,30,120,ADDR BuyDate,SIZEOF BuyDate-1
    278.         invoke TextOut,hdc,30,160,ADDR GoingDate,SIZEOF GoingDate-1
    279.         invoke TextOut,hdc,30,200,ADDR DateToday,SIZEOF DateToday-1
    280.         invoke TextOut,hdc,30,240,ADDR Variety,SIZEOF Variety-1
    281.         invoke TextOut,hdc,30,280,ADDR Model,SIZEOF Model-1
    282.         invoke TextOut,hdc,30,320,ADDR SerialNum,SIZEOF SerialNum-1
    283.         invoke TextOut,hdc,30,360,ADDR Diagnosis,SIZEOF Diagnosis-1
    284.         invoke TextOut,hdc,30,400,ADDR Equipment,SIZEOF Equipment-1
    285.         invoke TextOut,hdc,30,440,ADDR State,SIZEOF State-1
    286.         invoke TextOut,hdc,30,480,ADDR MobilePhoneNum,SIZEOF MobilePhoneNum-1
    287.         invoke TextOut,hdc,30,520,ADDR HomePhone,SIZEOF HomePhone-1
    288.         invoke TextOut,hdc,30,560,ADDR Address,SIZEOF Address-1
    289.         invoke TextOut,hdc,30,600,ADDR WarrantyPeriod,SIZEOF WarrantyPeriod-1
    290.         invoke EndPaint,hWnd, ADDR ps
    291.     .elseif uMsg==WM_COMMAND
    292.         mov eax,wParam
    293.         .if lParam==0
    294.             .if ax==IDM_OPEN
    295.            
    296.                
    297.                            
    298.  
    299.                
    300.             .if (hdcPrint != NULL)
    301.                 invoke StartDoc, hdcPrint, offset docinf
    302.                     ;invoke StartPage,hdcPrint
    303.                         invoke EndPage, hdcPrint
    304.                            
    305.                             invoke SaveDC,hdcPrint
    306.                             invoke SetMapMode, hdcPrint, MM_ISOTROPIC
    307.                             invoke SetWindowExtEx, hdcPrint, 1000, 1000, NULL                  
    308.                             invoke SetViewportExtEx, hdcPrint, 800, -600, NULL
    309.                             invoke SetViewportOrgEx, hdcPrint, 800 , 600, NULL
    310.                            
    311.                            
    312.                            
    313.                            
    314.  
    315.                             invoke SetTextAlign, hdcPrint, TA_BASELINE or TA_CENTER
    316.                             invoke TextOut, hdcPrint, 0, 0, offset HelloPrinter, 20
    317.  
    318.                            
    319.                             invoke LoadBitmap, hInstance, IDB_MAIN
    320.                             mov hBitmap, eax    
    321.  
    322.                             ;invoke CreateDC, NULL, OFFSET PrinterName, NULL, NULL
    323.                             ;mov hdcPrint, eax
    324.                             invoke CreateCompatibleDC, hdcPrint
    325.                             mov hMemDC, eax
    326.                             invoke SelectObject, hMemDC, hBitmap
    327.  
    328.                            
    329.                              invoke BitBlt, hdc, 0, 0, 1000, 1000, hMemDC, 0, 0, SRCCOPY   
    330.                             ;invoke Ellipse, hdcPrint, 0,0,500,500
    331.                             invoke Rectangle, hdc,0, 0, 100, 100
    332.                             invoke DeleteDC, hMemDC            
    333.    
    334.                            
    335.                             invoke RestoreDC, hdcPrint, -1
    336.                         invoke EndDoc, hdcPrint
    337.                     invoke DeleteDC, hdcPrint
    338.                 .endif 
    339.            
    340.             .elseif ax==IDM_WINBLT
    341.            
    342.                 invoke LoadBitmap, hInstance, IDB_MAIN
    343.                 mov hBitmap,eax
    344.                
    345.                 invoke GetDC, hWnd
    346.                 mov hdc, eax
    347.                 invoke CreateCompatibleDC, hdc
    348.                 mov hMemDC, eax
    349.                 invoke SelectObject, hMemDC, hBitmap
    350.                 invoke GetClientRect, hWnd, addr rect
    351.                 invoke BitBlt, hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY
    352.                 invoke DeleteDC, hMemDC
    353.                 invoke EndPaint, hWnd, addr ps
    354.  
    355.             .elseif ax==IDM_SAVE
    356.                 mov ofn.Flags,OFN_LONGNAMES or\
    357.                                 OFN_EXPLORER or OFN_HIDEREADONLY
    358.                 invoke GetSaveFileName, ADDR ofn
    359.                 .if eax==TRUE
    360.                     invoke CreateFile,ADDR buffer,\
    361.                                                 GENERIC_READ or GENERIC_WRITE ,\
    362.                                                 FILE_SHARE_READ or FILE_SHARE_WRITE,\
    363.                                                 NULL,CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,\
    364.                                                 NULL
    365.                     mov hFile,eax
    366.                     invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
    367.                     mov  hMemory,eax
    368.                     invoke GlobalLock,hMemory
    369.                    
    370.                    
    371.                     mov  pMemory,eax
    372.                     mov tempMemory,eax
    373.                    
    374.                    
    375.  
    376.                     invoke SendMessage,hwndEdit,WM_GETTEXT,MEMSIZE-1,pMemory
    377.                    
    378.                     ;invoke SendMessage,hwndEdit2,WM_GETTEXT,MEMSIZE-1,pMemory
    379.                    
    380.                                
    381.    
    382.                     invoke WriteFile,hFile,tempMemory,eax,ADDR SizeReadWrite,NULL
    383.                     invoke CloseHandle,hFile
    384.                     invoke GlobalUnlock,pMemory
    385.                     invoke GlobalFree,hMemory
    386.                 .endif
    387.                 invoke SetFocus,hwndEdit
    388.             .else
    389.                 invoke DestroyWindow, hWnd
    390.             .endif
    391.         .endif
    392.    
    393.     .else
    394.         invoke DefWindowProc, hWnd, uMsg, wParam, lParam
    395.         ret
    396.    
    397.     .endif
    398.     xor eax,eax
    399.     ret
    400. WndProc endp
    401. end start
     
  4. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    MM_TEXT сейчас попробую...
     
  5. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    вызываю вот так invoke BitBlt, hdc, 0, 0, 1000, 1000, hMemDC, 0, 0, SRCCOPY, с функцией GetDevCaps не разобрался, поэтому от фонаря передаю координаты, возможно в этом и причина...
     
  6. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    1)
    советую перенести в data?
    и поставить вместо dup(0) - dup(?).


    2)
    Раскомментируйте.

    3)
    Перенесите в конец, перед EndDoc.

    4)
    А вот это сильно мне подозрительственно!
    Существует ли такой битмап вообще? Видимо, он просто не загружается.
    Да, кстати, после освобождения битмапного DC не забудьте освободить и сам битмап (юзая DeleteObject).
     
  7. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    ;invoke StartPage,hdcPrint
    если это раскоментить вместо одной страницы лезет две, и первая всегда пустая...
    на Epson С43 SX была одна страница, правда код копмилил VS C++
    на лазерном HP - лезло две, masm32 компилил
    на струйном HP Photosmart 8000 - лезет тоже две

    по поводу IDB_MAIN волноватся не стоит, в файле ресурсов все прописано и проверено, все работает...
    если откомпилить прогу (хотя для этого нужен файл ресурсов) в меню есть пункт WINBLT, выбрав который таже картинка выскакивает в окне программы...
     
  8. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    и не надо со мной на вы...
     
  9. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    нету случайно исходника проги которая печатает картинку...?
     
  10. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Тогда, вполне возможно, что грабли-таки в этих вот строчках:

    Код (Text):
    1. invoke SetMapMode, hdcPrint, MM_ISOTROPIC
    2. invoke SetWindowExtEx, hdcPrint, 1000, 1000, NULL
    3. invoke SetViewportExtEx, hdcPrint, 800, -600, NULL
    4. invoke SetViewportOrgEx, hdcPrint, 800 , 600, NULL
    И если скормить BitBlt ширину/высоту рисунка, большую чем вью-порт, то просто ничего не выведетсо... пробуй сначала 100х100.

    [+]: Код есть, только, увы, на Делфях %)
     
  11. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    хотя... может быть их и лезит две потому что не верно заданы вот эти самые экстенты и логические единицы...
     
  12. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    ок, буду разбираться... на Делфи я наверное не пойму... спасибо...
     
  13. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    перенёс EndPage в конец, и раскоментил StartPage, начало печатать одну страничку, все как должно быть... отлично, хоть что то проявляется...
     
  14. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    Получилось! Победа нах!
    Вот только логики я так и не понял...
    Код (Text):
    1. invoke GetDC, hWnd
    2. mov hdc, eax
    3. invoke CreateCompatibleDC, hdc
    сделал вот так
    а было вот как
    Код (Text):
    1. invoke CreateDC, NULL, OFFSET PrinterName, NULL, NULL
    2. mov hdcPrint, eax
    3. invoke CreateCompatibleDC, hdcPrint
    не пойму зачем нужен хэндл окна при выводе на принтер...
     
  15. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    DC - это всего лишь контекст графического устройства. Средство абстрагироваться от оборудования. Поэтому от чего его наследовать - значения не имеет, ибо всё равно потом он будет связан с принтером.
     
  16. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    всё равно не совсем ясно... что означает "наследовать"...?
    функция CreateCompatibleDC, создаёт совместимый, с устройством вывода, контекст. И возвращает его описатель.
    Принимает тоже хэндл. Возникает вопрос - хэндл чего? Наверное того же что она и возвращает. Иначе как функция поймет, совместимый с чем контекст ей создавать. Вот я и передаю описатель контекста принтера.

    The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen.

    GetDC возвращает контекст устройства клиентской области окна.

    я правильно понимаю?

    Так зачем же нам создавать совместимый с клиентской областью окна контекст, мы ведь на принтер выводим?

    Если контекст клинтской области окна совместим с контекстом принтера, зачем тогда делить эти понятия?

    И почему тогда не прокатил для функции CreateCompatibleDC хэндл конт. принтера?
     
  17. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    "Совместимый" в данной терминологии означает "такой, для создания которого не требуется вручную указывать тучу параметров типа цветовой гаммы, RGB-плоскостей и прочей лабуды". Всё берётся из клонируемого DC. Видел же наверняка, сколь внушительный список параметров имеет CreateDC (я, в частности, про структуру DEVMODE)? И чтоб не грузить прогера такими вещами, была введена функция, "клонирующая" контексты графустройств, ибо на практике менять такие парамы, на отличные от принятых по умолчанию, необходимо крайне редко.


    Потому что физически они абстрагируют прогу от разных устройств. А совместимыми они быть и должны, т.к. всё же удобнее рисовать - хоть с помощью принтера, хоть на дисплее - с помощью одного набора функций. А то представьте: для отображения, скажем, картинки на монитор нужно ловить прерывание, для отрисовки чего-либо на принтер следует писать цепочку байт в порт, для текстового режима, чтобы написать на экране букофки - надо лезть в память по заданному адресу... Так было в DOS. Ну и ессно ето мало кому нравилось. И тогда мелкософт удачно спёр у кого-то идею так наз. HAL - hardware abstraction layer. Так что теперь разрабу не приходится судорожно дописывать в программу номера портов, по которым нужно отсылать символы на печать, и вручную кодить реализацию форматов такой передачи - дрова всё сделают за него. И понизят гамму, если принтер не поддерживает 32 битный цвет, и переведут картинку в ч/б если в принтере нет цветного картриджа...
    Ляпота одним словом ;)


    Наверное, потому что хендл был фиктивным (я не утверждаю, я предполагаю. могу и ошибаться. пусть профи, если сюда зайдут, поправят) - ты ж ничего ему не задал. Везде стояли нули! Ну а от чего тогда наследоваться-то?
     
  18. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    DEEP
    Большое спасибо за общение! Главное что все заработало...
     
  19. hellobody

    hellobody New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2008
    Сообщения:
    48
    и еще два слова:
    для получения контекста принтера, функцией CreateDC, достаточно всего одного аргумента - имя принтера...
    я, кстати, получил это имя ооочень хитрым способом - случайно распечатал пробную XP-шную страницу печати,
    и там обнаружил имя принтера...
    с функцией EnumPrinters не разобрался...
    и все работает!