MFC 编辑框内容更新方法以及滚动条设置
- 内容更新,之前已经说过一种就是调用UpdateData(FALSE);来实现。但是这种方法是对整个编辑框进行更新。
- 通过单个编辑内容设置更新内容。这种是调用SetDlgItemText(IDC_EDIT,m_Edit1_Value);来实现。
- 滚动条的设置,首先是要先设置一下编辑框属性,使能多行滚动,以及其滚动方式。之后申请一个编辑框的控制变量类型。
- 在事件处理时调用函数:m_Edit1_path_Ctl.LineScroll(m_Edit1_path_Ctl.GetLineCount());
- 更新后代码如下:
-
1 // FileCrcDlg.cpp : implementation file 2 // 3 4 #include "stdafx.h" 5 #include "FileCrc.h" 6 #include "FileCrcDlg.h" 7 8 #ifdef _DEBUG 9 #define new DEBUG_NEW 10 #undef THIS_FILE 11 static char THIS_FILE[] = __FILE__; 12 #endif 13 14 ///////////////////////////////////////////////////////////////////////////// 15 // CAboutDlg dialog used for App About 16 17 class CAboutDlg : public CDialog 18 { 19 public: 20 CAboutDlg(); 21 22 // Dialog Data 23 //{{AFX_DATA(CAboutDlg) 24 enum { IDD = IDD_ABOUTBOX }; 25 //}}AFX_DATA 26 27 // ClassWizard generated virtual function overrides 28 //{{AFX_VIRTUAL(CAboutDlg) 29 protected: 30 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 31 //}}AFX_VIRTUAL 32 33 // Implementation 34 protected: 35 //{{AFX_MSG(CAboutDlg) 36 //}}AFX_MSG 37 DECLARE_MESSAGE_MAP() 38 }; 39 40 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 41 { 42 //{{AFX_DATA_INIT(CAboutDlg) 43 //}}AFX_DATA_INIT 44 } 45 46 void CAboutDlg::DoDataExchange(CDataExchange* pDX) 47 { 48 CDialog::DoDataExchange(pDX); 49 //{{AFX_DATA_MAP(CAboutDlg) 50 //}}AFX_DATA_MAP 51 } 52 53 BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 54 //{{AFX_MSG_MAP(CAboutDlg) 55 // No message handlers 56 //}}AFX_MSG_MAP 57 END_MESSAGE_MAP() 58 59 ///////////////////////////////////////////////////////////////////////////// 60 // CFileCrcDlg dialog 61 62 CFileCrcDlg::CFileCrcDlg(CWnd* pParent /*=NULL*/) 63 : CDialog(CFileCrcDlg::IDD, pParent) 64 { 65 //{{AFX_DATA_INIT(CFileCrcDlg) 66 m_path = _T(""); 67 m_crc_hex = _T(""); 68 m_crc_dec = _T(""); 69 //}}AFX_DATA_INIT 70 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 71 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 72 } 73 74 void CFileCrcDlg::DoDataExchange(CDataExchange* pDX) 75 { 76 CDialog::DoDataExchange(pDX); 77 //{{AFX_DATA_MAP(CFileCrcDlg) 78 DDX_Control(pDX, IDC_EDIT3_crc_dec, m_Edit3_dec_Ctl); 79 DDX_Control(pDX, IDC_EDIT2_crc_hex, m_Edit2_hex_Ctl); 80 DDX_Control(pDX, IDC_EDIT1_path, m_Edit1_path_Ctl); 81 DDX_Text(pDX, IDC_EDIT1_path, m_path); 82 DDX_Text(pDX, IDC_EDIT2_crc_hex, m_crc_hex); 83 DDX_Text(pDX, IDC_EDIT3_crc_dec, m_crc_dec); 84 //}}AFX_DATA_MAP 85 } 86 87 BEGIN_MESSAGE_MAP(CFileCrcDlg, CDialog) 88 //{{AFX_MSG_MAP(CFileCrcDlg) 89 ON_WM_SYSCOMMAND() 90 ON_WM_PAINT() 91 ON_WM_QUERYDRAGICON() 92 ON_BN_CLICKED(IDOK, OnOpen) 93 ON_BN_CLICKED(IDC_BUTTON1, OnButton1_ClearAll) 94 ON_WM_DROPFILES() 95 //}}AFX_MSG_MAP 96 END_MESSAGE_MAP() 97 98 ///////////////////////////////////////////////////////////////////////////// 99 // CFileCrcDlg message handlers 100 101 BOOL CFileCrcDlg::OnInitDialog() 102 { 103 CDialog::OnInitDialog(); 104 105 // Add "About..." menu item to system menu. 106 107 // IDM_ABOUTBOX must be in the system command range. 108 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 109 ASSERT(IDM_ABOUTBOX < 0xF000); 110 111 CMenu* pSysMenu = GetSystemMenu(FALSE); 112 if (pSysMenu != NULL) 113 { 114 CString strAboutMenu; 115 strAboutMenu.LoadString(IDS_ABOUTBOX); 116 if (!strAboutMenu.IsEmpty()) 117 { 118 pSysMenu->AppendMenu(MF_SEPARATOR); 119 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 120 } 121 } 122 123 // Set the icon for this dialog. The framework does this automatically 124 // when the application's main window is not a dialog 125 SetIcon(m_hIcon, TRUE); // Set big icon 126 SetIcon(m_hIcon, FALSE); // Set small icon 127 128 // TODO: Add extra initialization here 129 130 return TRUE; // return TRUE unless you set the focus to a control 131 } 132 133 void CFileCrcDlg::OnSysCommand(UINT nID, LPARAM lParam) 134 { 135 if ((nID & 0xFFF0) == IDM_ABOUTBOX) 136 { 137 CAboutDlg dlgAbout; 138 dlgAbout.DoModal(); 139 } 140 else 141 { 142 CDialog::OnSysCommand(nID, lParam); 143 } 144 } 145 146 // If you add a minimize button to your dialog, you will need the code below 147 // to draw the icon. For MFC applications using the document/view model, 148 // this is automatically done for you by the framework. 149 150 void CFileCrcDlg::OnPaint() 151 { 152 if (IsIconic()) 153 { 154 CPaintDC dc(this); // device context for painting 155 156 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 157 158 // Center icon in client rectangle 159 int cxIcon = GetSystemMetrics(SM_CXICON); 160 int cyIcon = GetSystemMetrics(SM_CYICON); 161 CRect rect; 162 GetClientRect(&rect); 163 int x = (rect.Width() - cxIcon + 1) / 2; 164 int y = (rect.Height() - cyIcon + 1) / 2; 165 166 // Draw the icon 167 dc.DrawIcon(x, y, m_hIcon); 168 } 169 else 170 { 171 CDialog::OnPaint(); 172 } 173 } 174 175 // The system calls this to obtain the cursor to display while the user drags 176 // the minimized window. 177 HCURSOR CFileCrcDlg::OnQueryDragIcon() 178 { 179 return (HCURSOR) m_hIcon; 180 } 181 /****************************************************************************** 182 Public external variables declaration 183 ******************************************************************************/ 184 const unsigned short crc_table[256]={ 185 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 186 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 187 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 188 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 189 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 190 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 191 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 192 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 193 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 194 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 195 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 196 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 197 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 198 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 199 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 200 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 201 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 202 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 203 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 204 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 205 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 206 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 207 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 208 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 209 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 210 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 211 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 212 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 213 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 214 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 215 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 216 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 217 }; 218 219 220 /************************************************ 221 function name: crc 16 222 using e.g. 223 crc = 0xffff; 224 for(i=0;i<bytes_length;i++) 225 { 226 crc = crc_16(crc,data_bytes_buf[i]); 227 } 228 return crc; 229 *** 230 parameter: crc, data 231 return: crc-16 232 ************************************************/ 233 unsigned short crc_16(unsigned short crc, BYTE data) 234 { 235 BYTE da; 236 237 da=(BYTE)(crc/256); 238 crc<<=8; //crc=crc*256 239 crc ^= crc_table[da^data]; 240 return(crc); 241 } 242 //0x12a5 --> "12a5" 243 void swap_word_byte(WORD wd,BYTE *by) 244 { 245 unsigned char i,k; 246 for(i=0;i<4;i++) 247 { 248 k = (wd & 0xF000)>>12; 249 if(9>=k) 250 { 251 *by++=k+'0'; 252 } 253 else if((k>=0x0a)&&(0x0f>=k)) 254 { 255 *by++=k+0x37; 256 } 257 wd<<=4; 258 } 259 } 260 void CFileCrcDlg::OnOpen() 261 { 262 // TODO: Add your control notification handler code here 263 WORD n; 264 WORD i; 265 BYTE szchar[201]; 266 BYTE crc_hex[4],bt; 267 CString strtemp=""; 268 CFileDialog fileDlg(TRUE); 269 fileDlg.m_ofn.lpstrFilter="All files (*.*)"; 270 if(fileDlg.DoModal()==IDOK) 271 { 272 CFile file(fileDlg.m_ofn.lpstrFile,CFile::modeRead); 273 UpdateData(TRUE); 274 m_path += file.GetFilePath(); 275 m_path += "\r\n"; 276 //clear the Edit Dlg 277 i=0xffff; 278 memset(szchar,0,201); 279 while(file.Read(szchar,200)) 280 { 281 n=0; 282 while(szchar[n]) 283 { 284 i=crc_16(i,szchar[n]); 285 n++; 286 } 287 memset(szchar,0,201); 288 } 289 strtemp.Format("%d",i); 290 m_crc_dec+=strtemp; 291 m_crc_dec+="\r\n"; 292 293 swap_word_byte(i,crc_hex); 294 for(i=0;i<4;i++) 295 { 296 bt =*(char*)(crc_hex+i); 297 strtemp.Format("%c",bt); 298 m_crc_hex+=strtemp; 299 } 300 m_crc_hex += "\r\n"; 301 // write value to edit 302 SetDlgItemText(IDC_EDIT1_path,m_path); 303 SetDlgItemText(IDC_EDIT2_crc_hex,m_crc_hex); 304 SetDlgItemText(IDC_EDIT3_crc_dec,m_crc_dec); 305 //set the line scroll to the bottom 306 m_Edit1_path_Ctl.LineScroll(m_Edit1_path_Ctl.GetLineCount()); 307 m_Edit2_hex_Ctl.LineScroll(m_Edit2_hex_Ctl.GetLineCount()); 308 m_Edit3_dec_Ctl.LineScroll(m_Edit3_dec_Ctl.GetLineCount()); 309 file.Close(); 310 } 311 } 312 313 void CFileCrcDlg::OnButton1_ClearAll() 314 { 315 // TODO: Add your control notification handler code here 316 UpdateData(TRUE); 317 m_crc_dec = ""; 318 m_crc_hex = ""; 319 m_path = ""; 320 UpdateData(FALSE); 321 } 322 323 void CFileCrcDlg::OnDropFiles(HDROP hDropInfo) 324 { 325 // TODO: Add your message handler code here and/or call default 326 UINT j,iFileCount; 327 char file_name[MAX_PATH]; 328 //variable for crc 329 WORD n; 330 WORD i; 331 BYTE szchar[201]; 332 BYTE crc_hex[4],bt; 333 CString strtemp=""; 334 335 iFileCount=::DragQueryFile(hDropInfo,0xffffffff,NULL,0); 336 337 for(j=0;j<iFileCount;j++) 338 { 339 ::DragQueryFile(hDropInfo,j,file_name,MAX_PATH); 340 CFile file(file_name,CFile::modeRead); 341 UpdateData(TRUE); 342 //clear the Edit Dlg 343 i=0xffff; 344 memset(szchar,0,201); 345 while(file.Read(szchar,200)) 346 { 347 n=0; 348 while(szchar[n]) 349 { 350 i=crc_16(i,szchar[n]); 351 n++; 352 } 353 memset(szchar,0,201); 354 } 355 strtemp.Format("%d",i); 356 m_crc_dec+=strtemp; 357 m_crc_dec+="\r\n"; 358 359 swap_word_byte(i,crc_hex); 360 for(i=0;i<4;i++) 361 { 362 bt =*(char*)(crc_hex+i); 363 strtemp.Format("%c",bt); 364 m_crc_hex+=strtemp; 365 } 366 m_crc_hex += "\r\n"; 367 368 m_path += file.GetFilePath(); 369 m_path += "\r\n"; 370 // write value to edit 371 SetDlgItemText(IDC_EDIT1_path,m_path); 372 SetDlgItemText(IDC_EDIT2_crc_hex,m_crc_hex); 373 SetDlgItemText(IDC_EDIT3_crc_dec,m_crc_dec); 374 //set the line scroll to the bottom 375 m_Edit1_path_Ctl.LineScroll(m_Edit1_path_Ctl.GetLineCount()); 376 m_Edit2_hex_Ctl.LineScroll(m_Edit2_hex_Ctl.GetLineCount()); 377 m_Edit3_dec_Ctl.LineScroll(m_Edit3_dec_Ctl.GetLineCount()); 378 file.Close(); 379 } 380 ::DragFinish(hDropInfo); 381 CDialog::OnDropFiles(hDropInfo); 382 }
OK, That is all. Thank you!