From 399371ec09fa80e4fc07d2cc50523af26fd628f9 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Wed, 28 May 2008 19:52:46 +0000 Subject: [PATCH] - Start implementing shimgvw.dll svn path=/trunk/; revision=33741 --- reactos/dll/win32/shimgvw/lang/en-US.rc | 17 + reactos/dll/win32/shimgvw/res/main.ico | Bin 0 -> 40070 bytes reactos/dll/win32/shimgvw/res/next.bmp | Bin 0 -> 822 bytes reactos/dll/win32/shimgvw/res/prev.bmp | Bin 0 -> 822 bytes reactos/dll/win32/shimgvw/res/print.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/res/rot1.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/res/rot2.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/res/save.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/res/zoomm.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/res/zoomp.bmp | Bin 0 -> 824 bytes reactos/dll/win32/shimgvw/resource.h | 53 +++ reactos/dll/win32/shimgvw/rsrc.rc | 4 + reactos/dll/win32/shimgvw/shimgvw.c | 496 +++++++++++++++++++++++ reactos/dll/win32/shimgvw/shimgvw.h | 17 + reactos/dll/win32/shimgvw/shimgvw.rbuild | 15 + reactos/dll/win32/shimgvw/shimgvw.rc | 21 + reactos/dll/win32/shimgvw/shimgvw.spec | 14 + reactos/dll/win32/win32.rbuild | 3 + 18 files changed, 640 insertions(+) create mode 100644 reactos/dll/win32/shimgvw/lang/en-US.rc create mode 100644 reactos/dll/win32/shimgvw/res/main.ico create mode 100644 reactos/dll/win32/shimgvw/res/next.bmp create mode 100644 reactos/dll/win32/shimgvw/res/prev.bmp create mode 100644 reactos/dll/win32/shimgvw/res/print.bmp create mode 100644 reactos/dll/win32/shimgvw/res/rot1.bmp create mode 100644 reactos/dll/win32/shimgvw/res/rot2.bmp create mode 100644 reactos/dll/win32/shimgvw/res/save.bmp create mode 100644 reactos/dll/win32/shimgvw/res/zoomm.bmp create mode 100644 reactos/dll/win32/shimgvw/res/zoomp.bmp create mode 100644 reactos/dll/win32/shimgvw/resource.h create mode 100644 reactos/dll/win32/shimgvw/rsrc.rc create mode 100644 reactos/dll/win32/shimgvw/shimgvw.c create mode 100644 reactos/dll/win32/shimgvw/shimgvw.h create mode 100644 reactos/dll/win32/shimgvw/shimgvw.rbuild create mode 100644 reactos/dll/win32/shimgvw/shimgvw.rc create mode 100644 reactos/dll/win32/shimgvw/shimgvw.spec diff --git a/reactos/dll/win32/shimgvw/lang/en-US.rc b/reactos/dll/win32/shimgvw/lang/en-US.rc new file mode 100644 index 00000000000..af6bde0b4d7 --- /dev/null +++ b/reactos/dll/win32/shimgvw/lang/en-US.rc @@ -0,0 +1,17 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE +BEGIN + IDS_APPTITLE "ReactOS Picture and Fax Viewer" + IDS_SETASDESKBG "Set as Desktop Background" + + /* Tooltips */ + IDS_TOOLTIP_NEXT_PIC "Next Picture" + IDS_TOOLTIP_PREV_PIC "Previous Picture" + IDS_TOOLTIP_ZOOM_IN "Zoom In (+)" + IDS_TOOLTIP_ZOOM_OUT "Zoom Out (-)" + IDS_TOOLTIP_ROT_CLOCKW "Rotate Clockwise (Ctrl+K)" + IDS_TOOLTIP_ROT_COUNCW "Rotate Counterclockwise (Ctrl+L)" + IDS_TOOLTIP_PRINT "Print (Ctrl+P)" + IDS_TOOLTIP_SAVEAS "Save As... (Ctrl+S)" +END diff --git a/reactos/dll/win32/shimgvw/res/main.ico b/reactos/dll/win32/shimgvw/res/main.ico new file mode 100644 index 0000000000000000000000000000000000000000..4d0d75e474cd42603efb4720c690789b36b8ce9c GIT binary patch literal 40070 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 literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/next.bmp b/reactos/dll/win32/shimgvw/res/next.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e31ccefe73705c02c8be8d33e3ce0fd0af4754e9 GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H0s;ACiM$hyVk_e^g*QC1cKsji_Sycr3+Mik%_h zi)%jr_=Zm%Ob)2N`tmZHC3#A1!Iz)ifeGWJf$AHtugaW%5rfGX=wEry~qOX@E!Z@jvSZ+oJ^{xp-*^%b{P zIIk#CY72t94WgcHmLCYs@#k0)!o4PncXJ%y&LsXlDKh(W(l5=4+ubc*?+I}miuzf8 z>G#E^tZD+c=gaPK$}r5v1?c(A|t#N7Ee zcgL=6R%!`^`xiYts~opIIGulF=EO@I=UmxtF*!ACAxe0n#T?K(yC0uhedln?u_coA mUYPNPseb#z({XECk==l%2AK;q-)KU7_#%96KvqvMJp%yX)*;6L literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/prev.bmp b/reactos/dll/win32/shimgvw/res/prev.bmp new file mode 100644 index 0000000000000000000000000000000000000000..66d1bbffd46c4a1da4b106d21710de5ad885638c GIT binary patch literal 822 zcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpTufKW;GR#75gG8Mx&UGM|5Z3twEL*crl7 zY=scT!MgnHj#68&&62$8%gYF=2f9I|&OP#Ach1!Xjn`M>Q4e%O*y3vS2~ow@mj+#) zB)BW3@!D#h8YiF@IFfGkfjA26h9Kt^B^9?;n4GQ`*q_F?J+blXs``t|>&`5xJGB^s zAl3ohAYShox4S$2(j1xnIsAK4_;x1oZjR$#6UDJ4gl&#L+blmI0%`%OPg&Kb-xphU za$e}MUbS8M^1E`xcck%cisxPz&AB|BeL)aJF|vB|$tj)ZR^^_W?Xs`I^H7WLk&b}F zou2!eY`0bDugTV4nPI#p&w72yoa;N`?vZWutv)=b=gRts!#$ygx}pyC#vJU8+1C@Z zw>x@Icf{_Fke#iIZ|;St2YMOg-as;Y@BY1eiqZ$}ilJ#CK$Cj+V qb9ndTbI1n5)u1sTZi`#ny8Yp4V$?(27QU$3XhJ-Z>LE5_P0s*%i6936 literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/print.bmp b/reactos/dll/win32/shimgvw/res/print.bmp new file mode 100644 index 0000000000000000000000000000000000000000..93d940829d84c4ccea4e3f122d00302509ca546e GIT binary patch literal 824 zcmb7>%}&BV6osoU-56Isf=^&vyZ2d)6-YJe3Ro!bKrn3DCM-&5YZ|%|S%52Bkfh3A z3oIZ(Fq9?`J(-cFQ6Tzd=4R&3nVU0rj*btv7{USKKIYE%++g-deiP@r+jNoy!skEX zMd9-L>MsLI)P}O(?^mnU7XlVROw+`+QmGh*0VUOsMk7tr?g=VEQB_%%v)ODems1q% z)MBw1)a$w)jm5e13ye@W5{__eC~|VjvS-+Fk|Y%h1z$fL4oju-E8%T{Wmz;+tJQ99 z6G8oaK8L-*V35gV#^Z6lUT?SC&1SRJYBd@STudgDrSg+se>R(Wp7*huPN&oB^{76t z=dp;!W1=YXJdYRz89@+m3JsM0U!k{?$t0CZ-4W91H2hFp*QK5J#aJMNJlw)F%-go@ zI1X%dyWKVV2g2h5^c+m5)1~$CO7lOZCsD0h6l+PW|RE F%ojAoZQ%d_ literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/rot1.bmp b/reactos/dll/win32/shimgvw/res/rot1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..851d3c9e01121a630ef39f0c8b8693c120340006 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;M+IMhefOA|4WU- zz*b@dB!O(~ijYM0x}!yF-Q#z514$qoNd^nkVM-={l~drBCjNOLAhOEIacUM8bzq^e zg;iYT_Mux^fQs2>`2k5Fo3qRwD2}NmXKfEhscqP%X3+%^K*bOQWc#nLV=uJ<$|7rN z+Bui4)Fy00Q{IsoK*To3pM72c`+}hSle2P8&U9H@&Q@X#R0G$-QfviBImc&mFAw8d z5zf6Tvf%uDxHyop_{?^omfwH>z%{a#SSKHzB)BP_XHzWy)`Z*(bAig>vOvb^N7up^ z*T6-9PL15xExtR0e@}|wzO<}M^MLAq{`m!0kg>W`zBLfe<*jh^-d3-1vO?%sw(yCZ zm|L@WDjoX{EQ2Tj#yDr09WV^x>J?i8RHnuF+?*tOzEJE^vD2+yi{<%1OQ#=Q3v|3_ zod?i5m9}8G`mNWF0s|`J<^shlRY3I;mr9ZzE;L-6!ByeFRqi0(?#o(ib^ggsxOyN% zy(3Jb!$1ArLcQya;+INfE|&-2n^F8^wb!9m&T@Odd8NpTf$Uqa9!b`F@m4yzY^sVs xGd1VV;@~}PYLlXXDX?VIBs9fvZo&F~VB!I~4d`H=atHe<8T)Uah08K9008AF0{#F1 literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/rot2.bmp b/reactos/dll/win32/shimgvw/res/rot2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..59a67ce26d13a94607ce8c851e7fefa52d630a10 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;#{s_n`tC6^A4uYmM-l$}@2_HW z09%O-kOZ<( zVHIbYedv}JpklUJen1k)<|?-bilZt7@p9Jou$S8Sudfqb5CK#SK|prcre=;(Tc9km zmZqI^*-ETk)|Tg-oSA=e7W;xA_IUwpbNus;%mAXW4NYvNHb6DM|Na5$T6|_ZOR*Ik z6`Y^Xy(*GxML75Ju$<#F;o?9>_~M$=kFFtG1Qg7@FqeO80?(#c!A_ zw+3dc?u2uH{`mz|pLJ=T;J!5eJt^Y5Ga~nO13d*-0Q5U&nH@YH`wlGQsdS9FHB0zJ zj?l4ejguAL+v<5M9O3F!+Jb=wiq?4my)gagTA)!D%k!OX^@?387Cm3+b90i)v>3&f z0J!?|Pj0dnTZy;(a+N!9RX7+f&PaN=P~uVvP`%=ns*IZpfWfl$+EKWAAj5B7DQCI8 z*P+(pC#!?+&5*fVE`F&*?|NhUy@e7T{^}iJ$ciECl1-C(wJn^+1vRx6j&7$>1q>0D1@L24J!&Sl^GSl7RsLP7wnB literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/save.bmp b/reactos/dll/win32/shimgvw/res/save.bmp new file mode 100644 index 0000000000000000000000000000000000000000..441e702ce9d2c1a1c30492f19fe2698b371cbb48 GIT binary patch literal 824 zcmZ?rwP0od12Z700mK4O%*Y@C7H0y=3voj*SO7@;{_%B7Q{>_t$DEw(g4~?^-0b|E z?7W;TAj-{#qMYpPMS0FE^BlG|MepoL+FBpEe`}fFLJ(b4$jq_RJ-zCO~v%LCe;rq~gN-?c2BKfWd+V3ueriF=4`l&d$!p#zvr} zYstHdiCPPi)YWCJ!Q(2{M?-Nm5~Q06ob^K znO(BM+cS@WB!ee(;(^}A6`9U@!RQ(2%uYAW`fn5 zKRdRLS^f%x%w_!O?v8m7_0Laitn7GE-u9xj<#}<_^TNhw`Ss6oYoBFTKh3ConpXZa srSwU1$rE6(0M#F!Sq>yYD9sdtfH8tV>1MzH0VDIJ>E_4hH!v^&0QPt0RR910 literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/shimgvw/res/zoomm.bmp b/reactos/dll/win32/shimgvw/res/zoomm.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d795d49489405954328a1edaaa152c95af1fa2a GIT binary patch literal 824 zcmb`DOK%ck6oyfkZj38`g1?|~?b5`*(FD281t=01ns{qz(o(Mt*A`MJHC)sNs$wZP zTxQA?rj#->lApQB@XD}GV<8g&rbx)`7~Ngu2zD85~iV02uPBmip3%b zi5EK^!vo`-*=)6034*9rs}`$8YtYAHF>qcFho76KQ>m211FXhTo82Zhc;>_F?9zSO zf$e^LBb4{#N<}yldHn1NKBYr-cvEPCzusu@2mEDn1F$WN@h~4f*mOk~jkE)2wuyyT zFJ@*>c>Px`wSxKf-5)T>C zVjRaMy|X(G{FtYHcfr5f-igpoJn1vT@&Jrr5JF2(VQ?ufzVz8Y53S;TS@E_TIFJm>Rw@+` zh*yt~t+#A*4u{L_qG`I(XgFO?v(=JLr=jy&BJt2ZozLeH53rHM-5$5vmW9_(i%T~- zFR}aPnNr)+>UD`^^6rCsws-KZAX0SV8fqUv~gZi*rper zJerxc8*!}H?*UvA__>AomdFF#`naMBDetujxcx>+DJCJ=6a|7ZufKbXCU^NfFfbdu zFTAvOm{;oV2gHAEl~2S18=PjtGYrEl1zsRtkDK6kMc@|3K?QuDDoAKYNiXvc$ z-^^x0;T1aWgKeC4q+fj%@u$kZvK8Yz1p7W32rlOedBlUq%!DLKxzOy6mpqZ#pI?;k zYNNZ8 +#include "resource.h" + +#include "lang/en-US.rc" diff --git a/reactos/dll/win32/shimgvw/shimgvw.c b/reactos/dll/win32/shimgvw/shimgvw.c new file mode 100644 index 00000000000..bdf03670db1 --- /dev/null +++ b/reactos/dll/win32/shimgvw/shimgvw.c @@ -0,0 +1,496 @@ +/* + * + * PROJECT: ReactOS Picture and Fax Viewer + * FILE: dll/win32/shimgvw/shimgvw.c + * PURPOSE: shimgvw.dll + * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org) + * + * UPDATE HISTORY: + * 28/05/2008 Created + */ + +#include +#include +#include + +#include +#include +#include +#include + +#include "shimgvw.h" + + +HINSTANCE hInstance; +SHIMGVW_SETTINGS shiSettings; +WCHAR szOpenFileName[MAX_PATH]; + +HWND hDispWnd, hToolBar; + +/* ToolBar Buttons */ +static const TBBUTTON Buttons [] = +{ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ + {TBICON_PREV, IDC_PREV, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_NEXT, IDC_NEXT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, + {TBICON_ZOOMP, IDC_ZOOMP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_ZOOMM, IDC_ZOOMM, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, + {TBICON_ROT1, IDC_ROT1, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_ROT2, IDC_ROT2, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {15, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, + {TBICON_SAVE, IDC_SAVE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, + {TBICON_PRINT, IDC_PRINT, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, +}; + +static VOID +ImageView_DrawImage(HWND hwnd) +{ + GpGraphics *graphics; + GpImage *image; + UINT uImgWidth, uImgHeight; + UINT height = 0, width = 0, x = 0, y = 0; + PAINTSTRUCT ps; + RECT rect; + HDC hdc; + + if (GetFileAttributesW(szOpenFileName) == 0xFFFFFFFF) + return; + + hdc = BeginPaint(hwnd, &ps); + + GdipCreateFromHDC(hdc, &graphics); + GdipLoadImageFromFile(szOpenFileName, &image); + GdipGetImageWidth(image, &uImgWidth); + GdipGetImageHeight(image, &uImgHeight); + + if (GetClientRect(hwnd, &rect)) + { + FillRect(hdc, &rect, (HBRUSH)COLOR_WINDOW); + + if ((rect.right == uImgWidth)&&(rect.bottom == uImgHeight)) + { + x = 0, y = 0, width = rect.right, height = rect.bottom; + } + else if ((rect.right >= uImgWidth)&&(rect.bottom >= uImgHeight)) + { + x = (rect.right/2)-(uImgWidth/2); + y = (rect.bottom/2)-(uImgHeight/2); + width = uImgWidth; + height = uImgHeight; + } + else if ((rect.right < uImgWidth)||(rect.bottom < uImgHeight)) + { + if (rect.bottom < uImgHeight) + { + height = rect.bottom; + width = uImgWidth*(UINT)rect.bottom/uImgHeight; + x = (rect.right/2)-(width/2); + y = (rect.bottom/2)-(height/2); + } + if (rect.right < uImgWidth) + { + width = rect.right; + height = uImgHeight*(UINT)rect.right/uImgWidth; + x = (rect.right/2)-(width/2); + y = (rect.bottom/2)-(height/2); + } + if ((height > rect.bottom)||(width > rect.right)) + { + for (;;) + { + if (((int)width - 1 < 0)||((int)height - 1 < 0)) break; + width -= 1; + height -= 1; + y = (rect.bottom/2)-(height/2); + x = (rect.right/2)-(width/2); + if ((height < rect.bottom)&&(width < rect.right)) break; + } + } + } + else if ((rect.right <= uImgWidth)&&(rect.bottom <= uImgHeight)) + { + height = uImgHeight*(UINT)rect.right/uImgWidth; + y = (rect.bottom/2)-(height/2); + width = rect.right; + + if ((height > rect.bottom)||(width > rect.right)) + { + for (;;) + { + if (((int)width - 1 < 0)||((int)height - 1 < 0)) break; + width -= 1; + height -= 1; + y = (rect.bottom/2)-(height/2); + x = (rect.right/2)-(width/2); + if ((height < rect.bottom)&&(width < rect.right)) break; + } + } + } + + //TCHAR szBuf[MAX_PATH]; + //wsprintf(szBuf, _T("x = %d\ny = %d\nWidth = %d\nHeight = %d\n\nrect.right = %d\nrect.bottom = %d\n\nuImgWidth = %d\nuImgHeight = %d"), x, y, width, height, rect.right, rect.bottom, uImgWidth, uImgHeight); + //MessageBox(0, szBuf, NULL, MB_OK); + GdipDrawImageRect(graphics, image, x, y, width, height); + } + + DeleteDC(hdc); + EndPaint(hwnd, &ps); +} + +static BOOL +ImageView_LoadSettings() +{ + HKEY hKey; + DWORD dwSize; + + if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + dwSize = sizeof(SHIMGVW_SETTINGS); + if (RegQueryValueEx(hKey, _T("Settings"), NULL, NULL, (LPBYTE)&shiSettings, &dwSize) == ERROR_SUCCESS) + { + RegCloseKey(hKey); + return TRUE; + } + + RegCloseKey(hKey); + } + + return FALSE; +} + +static VOID +ImageView_SaveSettings(HWND hwnd) +{ + WINDOWPLACEMENT wp; + HKEY hKey; + + ShowWindow(hwnd, SW_HIDE); + wp.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hwnd, &wp); + + shiSettings.Left = wp.rcNormalPosition.left; + shiSettings.Top = wp.rcNormalPosition.top; + shiSettings.Right = wp.rcNormalPosition.right; + shiSettings.Bottom = wp.rcNormalPosition.bottom; + shiSettings.Maximized = (IsZoomed(hwnd) || (wp.flags & WPF_RESTORETOMAXIMIZED)); + + if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\ReactOS\\shimgvw"), 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) + { + RegSetValueEx(hKey, _T("Settings"), 0, REG_BINARY, (LPBYTE)&shiSettings, sizeof(SHIMGVW_SETTINGS)); + RegCloseKey(hKey); + } +} + +static BOOL +ImageView_CreateToolBar(HWND hwnd) +{ + INT numButtons = sizeof(Buttons) / sizeof(Buttons[0]); + + hToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, + WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | TBSTYLE_TOOLTIPS, + 0, 0, 0, 0, hwnd, + 0, hInstance, NULL); + if(hToolBar != NULL) + { + HIMAGELIST hImageList; + + SendMessage(hToolBar, TB_SETEXTENDEDSTYLE, + 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); + + SendMessage(hToolBar, TB_BUTTONSTRUCTSIZE, + sizeof(Buttons[0]), 0); + + hImageList = ImageList_Create(TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, ILC_MASK | ILC_COLOR24, 1, 1); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_PREVICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_NEXTICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_ZOOMPICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_ZOOMMICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_SAVEICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_PRINTICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_ROT1ICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + ImageList_AddMasked(hImageList, LoadImage(hInstance, MAKEINTRESOURCE(IDB_ROT2ICON), IMAGE_BITMAP, + TB_IMAGE_WIDTH, TB_IMAGE_HEIGHT, LR_DEFAULTCOLOR), RGB(255, 255, 255)); + + if (hImageList == NULL) return FALSE; + + ImageList_Destroy((HIMAGELIST)SendMessage(hToolBar, TB_SETIMAGELIST, + 0, (LPARAM)hImageList)); + + SendMessage(hToolBar, TB_ADDBUTTONS, + numButtons, (LPARAM)Buttons); + + return TRUE; + } + + return FALSE; +} + +static VOID +ImageView_InitControls(HWND hwnd) +{ + MoveWindow(hwnd, shiSettings.Left, shiSettings.Top, + shiSettings.Right - shiSettings.Left, + shiSettings.Bottom - shiSettings.Top, TRUE); + + if (shiSettings.Maximized) ShowWindow(hwnd, SW_MAXIMIZE); + + hDispWnd = CreateWindowEx(WS_EX_TRANSPARENT, _T("STATIC"), _T(""), + WS_CHILD | WS_VISIBLE, + 0, 0, 0, 0, hwnd, NULL, hInstance, NULL); + + ImageView_CreateToolBar(hwnd); +} + +LRESULT CALLBACK +ImageView_WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CREATE: + { + ImageView_InitControls(hwnd); + } + break; + + case WM_COMMAND: + { + switch (wParam) + { + case IDC_PREV: + + break; + case IDC_NEXT: + + break; + case IDC_ZOOMP: + + break; + case IDC_ZOOMM: + + break; + case IDC_SAVE: + + break; + case IDC_PRINT: + + break; + case IDC_ROT1: + + break; + case IDC_ROT2: + + break; + } + } + break; + + case WM_NOTIFY: + { + LPNMHDR pnmhdr = (LPNMHDR)lParam; + + switch (pnmhdr->code) + { + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + UINT idButton; + + lpttt = (LPTOOLTIPTEXT)lParam; + idButton = (UINT)lpttt->hdr.idFrom; + + switch (idButton) + { + case IDC_PREV: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PREV_PIC); + break; + case IDC_NEXT: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEXT_PIC); + break; + case IDC_ZOOMP: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_IN); + break; + case IDC_ZOOMM: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ZOOM_OUT); + break; + case IDC_SAVE: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SAVEAS); + break; + case IDC_PRINT: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PRINT); + break; + case IDC_ROT1: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ROT_COUNCW); + break; + case IDC_ROT2: + lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_ROT_CLOCKW); + break; + } + } + } + } + break; + + case WM_PAINT: + { + ImageView_DrawImage(hDispWnd); + } + break; + + case WM_SIZING: + { + LPRECT pRect = (LPRECT)lParam; + if (pRect->right-pRect->left < 350) + pRect->right = pRect->left + 350; + + if (pRect->bottom-pRect->top < 290) + pRect->bottom = pRect->top + 290; + } + break; + + case WM_SIZE: + { + MoveWindow(hDispWnd, 1, 1, LOWORD(lParam)-1, HIWORD(lParam)-35, TRUE); + SendMessage(hToolBar, TB_AUTOSIZE, 0, 0); + } + break; + + case WM_DESTROY: + { + ImageView_SaveSettings(hwnd); + PostQuitMessage(0); + } + break; + } + + return DefWindowProc(hwnd, Message, wParam, lParam); +} + +LONG +ImageView_CreateWindow(HWND hwnd, LPWSTR szFileName) +{ + struct GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken; + WNDCLASS WndClass = {0}; + TCHAR szBuf[512]; + HWND hMainWnd; + MSG msg; + + wcscpy(szOpenFileName, szFileName); + + if (!ImageView_LoadSettings()) + { + shiSettings.Maximized = FALSE; + shiSettings.Left = 0; + shiSettings.Top = 0; + shiSettings.Right = 520; + shiSettings.Bottom = 400; + } + + // Initialize GDI+ + gdiplusStartupInput.GdiplusVersion = 1; + gdiplusStartupInput.DebugEventCallback = NULL; + gdiplusStartupInput.SuppressBackgroundThread = 0; + gdiplusStartupInput.SuppressExternalCodecs = 0; + + GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + // Create the window + WndClass.lpszClassName = _T("shimgvw_window"); + WndClass.lpfnWndProc = (WNDPROC)ImageView_WndProc; + WndClass.hInstance = hInstance; + WndClass.style = CS_HREDRAW | CS_VREDRAW; + WndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPICON)); + WndClass.hCursor = LoadCursor(hInstance, IDC_ARROW); + WndClass.hbrBackground = (HBRUSH)COLOR_WINDOW; + + if (!RegisterClass(&WndClass)) return -1; + + LoadString(hInstance, IDS_APPTITLE, szBuf, sizeof(szBuf) / sizeof(TCHAR)); + hMainWnd = CreateWindow(_T("shimgvw_window"), szBuf, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE | WS_CAPTION, + CW_USEDEFAULT, CW_USEDEFAULT, + 0, 0, NULL, NULL, hInstance, NULL); + + // Show it + ShowWindow(hMainWnd, SW_SHOW); + UpdateWindow(hMainWnd); + + // Message Loop + while(GetMessage(&msg,NULL,0,0)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + + GdiplusShutdown(gdiplusToken); + return -1; +} + +LONG +CALLBACK +ImageView_FullscreenW(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + return ImageView_CreateWindow(hwnd, (LPWSTR)lParam1); +} + +LONG +CALLBACK +ImageView_Fullscreen(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + WCHAR szFile[MAX_PATH]; + + if (MultiByteToWideChar(CP_ACP, 0, (char*)lParam1, strlen((char*)lParam1)+1, szFile, MAX_PATH)) + { + return ImageView_CreateWindow(hwnd, (LPWSTR)szFile); + } + + return -1; +} + +LONG +CALLBACK +ImageView_FullscreenA(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2) +{ + WCHAR szFile[MAX_PATH]; + + if (MultiByteToWideChar(CP_ACP, 0, (char*)lParam1, strlen((char*)lParam1)+1, szFile, MAX_PATH)) + { + return ImageView_CreateWindow(hwnd, (LPWSTR)szFile); + } + + return -1; +} + +BOOL WINAPI +DllMain(IN HINSTANCE hinstDLL, + IN DWORD dwReason, + IN LPVOID lpvReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + hInstance = hinstDLL; + break; + } + + return TRUE; +} + diff --git a/reactos/dll/win32/shimgvw/shimgvw.h b/reactos/dll/win32/shimgvw/shimgvw.h new file mode 100644 index 00000000000..90cec1536b0 --- /dev/null +++ b/reactos/dll/win32/shimgvw/shimgvw.h @@ -0,0 +1,17 @@ +#include + +#include "resource.h" + +#define TB_IMAGE_WIDTH 16 +#define TB_IMAGE_HEIGHT 16 + +extern HINSTANCE hInstance; + +typedef struct +{ + BOOL Maximized; + INT Left; + INT Top; + INT Right; + INT Bottom; +} SHIMGVW_SETTINGS; diff --git a/reactos/dll/win32/shimgvw/shimgvw.rbuild b/reactos/dll/win32/shimgvw/shimgvw.rbuild new file mode 100644 index 00000000000..99e1d1364cc --- /dev/null +++ b/reactos/dll/win32/shimgvw/shimgvw.rbuild @@ -0,0 +1,15 @@ + + + . + + kernel32 + advapi32 + comctl32 + ntdll + user32 + gdi32 + gdiplus + shimgvw.c + shimgvw.rc + shimgvw.spec + diff --git a/reactos/dll/win32/shimgvw/shimgvw.rc b/reactos/dll/win32/shimgvw/shimgvw.rc new file mode 100644 index 00000000000..5b5451750fd --- /dev/null +++ b/reactos/dll/win32/shimgvw/shimgvw.rc @@ -0,0 +1,21 @@ +#include +#include "resource.h" + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Picture and Fax Viewer\0" +#define REACTOS_STR_INTERNAL_NAME "shimgvw\0" +#define REACTOS_STR_ORIGINAL_FILENAME "shimgvw.dll\0" +#include + +IDI_APPICON ICON "res/main.ico" + +IDB_PREVICON BITMAP "res/prev.bmp" +IDB_NEXTICON BITMAP "res/next.bmp" +IDB_ZOOMPICON BITMAP "res/zoomp.bmp" +IDB_ZOOMMICON BITMAP "res/zoomm.bmp" +IDB_SAVEICON BITMAP "res/save.bmp" +IDB_PRINTICON BITMAP "res/print.bmp" +IDB_ROT1ICON BITMAP "res/rot1.bmp" +IDB_ROT2ICON BITMAP "res/rot2.bmp" + +#include "rsrc.rc" diff --git a/reactos/dll/win32/shimgvw/shimgvw.spec b/reactos/dll/win32/shimgvw/shimgvw.spec new file mode 100644 index 00000000000..cf99f65b207 --- /dev/null +++ b/reactos/dll/win32/shimgvw/shimgvw.spec @@ -0,0 +1,14 @@ +@ stub ImageView_COMServer +@ stdcall ImageView_Fullscreen(ptr long ptr ptr) +@ stdcall ImageView_FullscreenA(ptr long ptr ptr) +@ stdcall ImageView_FullscreenW(ptr long ptr ptr) +@ stub ImageView_PrintTo +@ stub ImageView_PrintToA +@ stub ImageView_PrintToW +@ stub imageview_fullscreenW +@ stub ConvertDIBSECTIONToThumbnail +@ stub DllCanUnloadNow +@ stub DllGetClassObject +@ stub DllInstall +@ stub DllRegisterServer +@ stub DllUnregisterServer diff --git a/reactos/dll/win32/win32.rbuild b/reactos/dll/win32/win32.rbuild index 712b3c80ca6..395de4dd5a1 100644 --- a/reactos/dll/win32/win32.rbuild +++ b/reactos/dll/win32/win32.rbuild @@ -292,6 +292,9 @@ + + +