DlgGuessWidth.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:7k
源码类别:

图片显示

开发平台:

Visual C++

  1. // DlgGuessWidth.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "DlgGuessWidth.h"
  6. #include "guesswidth.h"
  7. #include <math.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDlgGuessWidth dialog
  15. CDlgGuessWidth::CDlgGuessWidth(CWnd* pParent /*=NULL*/)
  16. : CDialog(CDlgGuessWidth::IDD, pParent)
  17. {
  18. //{{AFX_DATA_INIT(CDlgGuessWidth)
  19. m_iDepth = 0;
  20. m_iHeight = 0;
  21. m_iWidth = 0;
  22. m_iHeaderSize = 0;
  23. //}}AFX_DATA_INIT
  24. m_dCorr=-1.0;
  25. }
  26. void CDlgGuessWidth::DoDataExchange(CDataExchange* pDX)
  27. {
  28. CDialog::DoDataExchange(pDX);
  29. //{{AFX_DATA_MAP(CDlgGuessWidth)
  30. DDX_Radio(pDX, IDC_8BITS, m_iDepth);
  31. DDX_Text(pDX, IDC_EDIT_HEIGHT, m_iHeight);
  32. DDX_Text(pDX, IDC_EDIT_WIDTH, m_iWidth);
  33. DDX_Text(pDX, IDC_EDIT_HEADER_SIZE, m_iHeaderSize);
  34. //}}AFX_DATA_MAP
  35. }
  36. BEGIN_MESSAGE_MAP(CDlgGuessWidth, CDialog)
  37. //{{AFX_MSG_MAP(CDlgGuessWidth)
  38. ON_EN_KILLFOCUS(IDC_EDIT_WIDTH, OnKillfocusEditWidth)
  39. ON_EN_SETFOCUS(IDC_EDIT_WIDTH, OnSetfocusEditWidth)
  40. ON_EN_KILLFOCUS(IDC_EDIT_HEIGHT, OnKillfocusEditHeight)
  41. ON_EN_SETFOCUS(IDC_EDIT_HEIGHT, OnSetfocusEditHeight)
  42. ON_EN_KILLFOCUS(IDC_EDIT_HEADER_SIZE, OnKillfocusEditHeaderSize)
  43. ON_EN_SETFOCUS(IDC_EDIT_HEADER_SIZE, OnSetfocusEditHeaderSize)
  44. ON_BN_CLICKED(IDC_GUESS, OnGuess)
  45. ON_BN_CLICKED(IDC_SWAP, OnSwap)
  46. ON_WM_CTLCOLOR()
  47. //}}AFX_MSG_MAP
  48. ON_COMMAND_RANGE(IDC_8BITS, IDC_64BITS, OnChannels)
  49. END_MESSAGE_MAP()
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CDlgGuessWidth message handlers
  52. void CDlgGuessWidth::OnKillfocusEditWidth() 
  53. {
  54. UpdateData(TRUE);
  55. UINT iByte;
  56. if(m_iDepth == 4)
  57. {
  58. iByte = 8;
  59. }
  60. else
  61. {
  62. iByte = (UINT)(1 + m_iDepth);
  63. }
  64. if(m_iWidth != 0)
  65. {
  66. m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
  67. }
  68. UpdateData(FALSE);
  69. }
  70. void CDlgGuessWidth::OnSetfocusEditWidth() 
  71. {
  72. CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_WIDTH);
  73. ASSERT(IsWindow(pEdit->m_hWnd));
  74. // ASSERT_KINDOF(CEdit,pEdit);
  75. pEdit->SetSel(0,-1);
  76. }
  77. void CDlgGuessWidth::OnKillfocusEditHeight() 
  78. {
  79. }
  80. void CDlgGuessWidth::OnSetfocusEditHeight() 
  81. {
  82. CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);
  83. ASSERT(IsWindow(pEdit->m_hWnd));
  84. // ASSERT_KINDOF(CEdit,pEdit);
  85. pEdit->SetSel(0,-1);
  86. }
  87. void CDlgGuessWidth::OnKillfocusEditHeaderSize() 
  88. {
  89. UpdateData(TRUE);
  90. if(m_iHeaderSize > FILELENGTH)
  91. {
  92. MessageBox("ERROR: Header size must smaller then the file size!",
  93. NULL,MB_OK | MB_ICONERROR);
  94. m_iHeaderSize = FILELENGTH;
  95. UpdateData(FALSE);
  96. CWnd *pWnd = GetDlgItem(IDC_EDIT_HEADER_SIZE);
  97. ASSERT(IsWindow(pWnd->m_hWnd));
  98. pWnd->SetFocus();
  99. }
  100. else
  101. {
  102. UINT iByte;
  103. if(m_iDepth == 4)
  104. {
  105. iByte = 8;
  106. }
  107. else
  108. {
  109. iByte = (UINT)(1 + m_iDepth);
  110. }
  111. if(m_iWidth != 0)
  112. {
  113. m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
  114. }
  115. UpdateData(FALSE);
  116. }
  117. }
  118. void CDlgGuessWidth::OnSetfocusEditHeaderSize() 
  119. {
  120. CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_HEADER_SIZE);
  121. ASSERT(IsWindow(pEdit->m_hWnd));
  122. // ASSERT_KINDOF(CEdit,pEdit);
  123. pEdit->SetSel(0,-1);
  124. }
  125. void CDlgGuessWidth::OnGuess() 
  126. {
  127. UpdateData(TRUE);
  128. CGuessWidth guess;
  129. AfxGetApp()->BeginWaitCursor();
  130. short iByte;
  131. if(m_iDepth == 4)
  132. {
  133. iByte = 8;
  134. }
  135. else
  136. {
  137. iByte = (UINT)(1 + m_iDepth);
  138. }
  139. m_dCorr = guess.WidthDetect(m_iWidth, m_iHeight, PATHNAME, iByte, m_iHeaderSize);
  140. AfxGetApp()->EndWaitCursor();
  141. UpdateData(FALSE);
  142. }
  143. void CDlgGuessWidth::OnSwap() 
  144. {
  145. UpdateData(TRUE);
  146. DWORD iTemp = m_iWidth;
  147. m_iWidth = m_iHeight;
  148. m_iHeight = iTemp;
  149. UpdateData(FALSE);
  150. }
  151. void CDlgGuessWidth::OnOK() 
  152. {
  153. UpdateData(TRUE);
  154. UINT iByte;
  155. if(m_iDepth == 4)
  156. {
  157. iByte = 8;
  158. }
  159. else
  160. {
  161. iByte = (UINT)(1 + m_iDepth);
  162. }
  163. DWORD iTotalSize = m_iWidth*m_iHeight*iByte + m_iHeaderSize;
  164. if(iTotalSize > FILELENGTH)
  165. {
  166. MessageBox("ERROR: Given size is larger then the file size!",
  167. NULL,MB_OK | MB_ICONERROR);
  168. CWnd *pWnd = GetDlgItem(IDC_EDIT_HEIGHT);
  169. ASSERT(IsWindow(pWnd->m_hWnd));
  170. pWnd->SetFocus();
  171. return;
  172. }
  173. else if(iTotalSize < FILELENGTH)
  174. {
  175. if(MessageBox(
  176. "ALERT: Given size is smaller then the file size,Open anyway?",
  177. NULL,MB_YESNO | MB_ICONWARNING) != IDYES)
  178. {
  179. CWnd *pWnd = GetDlgItem(IDC_EDIT_HEIGHT);
  180. ASSERT(IsWindow(pWnd->m_hWnd));
  181. pWnd->SetFocus();
  182. return;
  183. }
  184. }
  185. CDialog::OnOK();
  186. }
  187. BOOL CDlgGuessWidth::OnInitDialog() 
  188. {
  189. CDialog::OnInitDialog();
  190. /* m_btOK.SubclassDlgItem(IDOK, this);
  191. m_btOK.SetIcon(IDI_OKAC, IDI_OKUN);
  192. m_btOK.SetActiveBgColor(RGB(220,220,220));
  193. m_btOK.SetActiveFgColor(RGB(255,0,0));
  194. m_btOK.SetBtnCursor(IDC_GREEN);
  195. m_btCancel.SubclassDlgItem(IDCANCEL, this);
  196. m_btCancel.SetIcon(IDI_CANCELAC, IDI_CANCELUN);
  197. m_btCancel.SetActiveBgColor(RGB(220,220,220));
  198. m_btCancel.SetActiveFgColor(RGB(255,0,0));
  199. m_btCancel.SetBtnCursor(IDC_GREEN);
  200. */
  201. SetWindowText(TITLE);
  202. CFile file;
  203. if(!file.Open(PATHNAME,CFile::modeRead | CFile::shareExclusive))
  204. {
  205. return FALSE;
  206. }
  207. FILELENGTH = file.GetLength();
  208. file.Close();
  209. UINT iByte;
  210. if(m_iDepth == 4)
  211. {
  212. iByte = 8;
  213. }
  214. else
  215. {
  216. iByte = (UINT)(1 + m_iDepth);
  217. }
  218. iByte = (FILELENGTH - m_iHeaderSize) / iByte;
  219. m_iWidth = m_iHeight = (DWORD)sqrt(iByte);
  220. while((iByte % m_iWidth) != 0) m_iWidth--;
  221. m_iHeight = iByte / m_iWidth;
  222. CWnd* pWnd = GetDlgItem(IDC_FILE_DESCRIBE);
  223. ASSERT_VALID(pWnd);
  224. if(IsWindow(pWnd->m_hWnd))
  225. {
  226. char szDes[MAX_PATH+40];
  227. char *pExt=strrchr(PATHNAME,'\');
  228. sprintf(szDes,"Describe: " %s "n%d bytes",++pExt,FILELENGTH);
  229. pWnd->SetWindowText((LPCTSTR)szDes);
  230. }
  231. UpdateData(FALSE);
  232. return TRUE;  // return TRUE unless you set the focus to a control
  233. // EXCEPTION: OCX Property Pages should return FALSE
  234. }
  235. HBRUSH CDlgGuessWidth::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  236. {
  237. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  238. if(pWnd->GetDlgCtrlID() == IDC_EDIT_HEADER_SIZE)
  239. {
  240. if(IsWindow(pWnd->m_hWnd))
  241. {
  242. CBrush b;
  243. b.CreateSolidBrush(RGB(0,96,249));
  244. CRect rc;
  245. pWnd->GetClientRect(&rc);
  246. pDC->FillRect(&rc,&b);
  247. pDC->SetBkColor(RGB(0,96,249));
  248. }
  249. }
  250. // TODO: Change any attributes of the DC here
  251. // TODO: Return a different brush if the default is not desired
  252. return hbr;
  253. }
  254. void CDlgGuessWidth::OnChannels(UINT uID)
  255. {
  256. UpdateData(TRUE);
  257. UINT iByte;
  258. if(m_iDepth == 4)
  259. {
  260. iByte = 8;
  261. }
  262. else
  263. {
  264. iByte = (UINT)(1 + m_iDepth);
  265. }
  266. if(m_iWidth != 0)
  267. {
  268. m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
  269. }
  270. UpdateData(FALSE);
  271. }