본문 바로가기

MFC

[MFC] ListBox 가로스크룰바 생성 우선 Stylr에서 Horizontal scroll을 체크한다. 다음 코드를 추가하면 끝~ CString str; CSize sz; int dx=0; CDC* pDC = pmyListBox->GetDC(); for (int i=0;i < pmyListBox->GetCount();i++) { pmyListBox->GetText( i, str ); sz = pDC->GetTextExtent(str); if (sz.cx > dx) dx = sz.cx; } pmyListBox->ReleaseDC(pDC); // Set the horizontal extent so every character of all strings // can be scrolled to. pmyListBox->SetHorizontalExten.. 더보기
[MFC] 사용자 정의 컨트롤 만드는 법은 예제와 파일을 본다면 충분히 만들것으로 예상된다.. 더보기
MFC의 문서화되지 않은 매크로들 MFC의 문서화되지 않은 매크로들 (UNDOCUMENTED MACROs) DEVPIA에서 발췌 ------------------------------------------------------------------------------------------ #define DEBUG_ONLY(f) _DEBUG일 때는 (f)가 되고 아니면 (0)이 됩니다. ------------------------------------------------------------------------------------------ 다음 매크로를 사용해서 포인터를 체크할 수 있습니다. #define ASSERT_POINTER(p, type) p가 NULL이 아니고 p에서부터 type의 크기(sizeof(type)이겠죠?)만.. 더보기
[MFC] Virtual-Key Codes 가상키 코드 Constant/value Description VK_LBUTTON 0x01 Left mouse button VK_RBUTTON 0x02 Right mouse button VK_CANCEL 0x03 Control-break processing VK_MBUTTON 0x04 Middle mouse button (three-button mouse) VK_XBUTTON1 0x05 X1 mouse button VK_XBUTTON2 0x06 X2 mouse button - 0x07 Undefined VK_BACK 0x08 BACKSPACE key VK_TAB 0x09 TAB key - 0x0A-0B Reserved VK_CLEAR 0x0C CLEAR key VK_RETURN 0x0D ENTER key - 0x0E-.. 더보기
[MFC] 마우스 드래그하여 Dialog 이동하기 //header afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //cpp BEGIN_MESSAGE_MAP(CTest, CDialog) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() void CTest::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0); CDialog::OnLButtonDown(nFlags, point); } 더보기
콤보박스 아이템 전체 삭제 CComboBox* pCombo = (CComboBox*)GetDlgItem( IDC_COMBO_ORIGIN_PRESET ); pCombo->ResetContent(); 간단 하게 해결 됩니다..ㅋㅋ 더보기
[MFC] Edit(수정) 가능 ListCtrl(ListControl) 출처 :: http://mnlt.tistory.com/131 ListControl은 MFC에서 굉장히 유용 히 쓰이는 컨트롤입니다. 해당 컨트롤에서 직접 원하는 위치를 즉석 수정하기 위한 컨트롤을 만들었습니다. 아마 그냥 유용하게 쓰일듯 싶기도 해서 포스팅. //EditListCtrl.h #pragma once // CEditListCtrl class CEditListCtrl : public CListCtrl { DECLARE_DYNAMIC(CEditListCtrl) public: CEditListCtrl(); virtual ~CEditListCtrl(); protected: DECLARE_MESSAGE_MAP() public: virtual BOOL PreTranslateMessage(MSG* pMsg.. 더보기
버튼 클릭시 생기는 점선 제거. HWND hWnd= ::GetDlgItem(GetParent()->GetSafeHwnd(), IDC_EDIT_CAM_ATTR); ::SendMessage(hWnd, WM_KILLFOCUS, 0, 0); //이렇게 해결 될 듯 보입니다... //해봐야 알꺼 같네여..!! 더보기
[MFC] ListCtrl 팁.. ========================================== 1. 특정 ROW 포커스 주기 2. 특정 ROW로 가기 3. 헤더 컬럼수 얻어오기 4. 컬럼의 너비를 이쁘게 주기 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기 6. 선택한 아이템(ROW)를 지우기 7. 두 아이템을 스왑 하기 8. 기존에 선택되어있는 것을 해체하기 9. List Control의 0번째 컬럼 사이즈 변경하지 못 하도록 프로그래밍 10. List Control 에 다른 Control 넣기 11. List Control 행크기 늘리기 12. List Control 에서 시스템 아이콘 사용하기 1. 특정 ROW 포커스 주기 --------------------------------------------------- .. 더보기
STL 설명 인터넷 링크 http://www.codesarang.com/code/content_47.html 좋아 보여서 사이트 링크 올려 놓습니다.. 더보기
MFC HotKey 등록법 Ctrl + I 핫키 키로 등록할 경우 전역변수 int m_HotkeyWsChangeID; 선언 시작시 정의 //핫키 등록m_HotkeyWsChangeID = ::GlobalAddAtom(_T("TopMonitorkey")); if(!::RegisterHotKey(GetSafeHwnd(), m_HotkeyWsChangeID , MOD_CONTROL, 'P')) AfxMessageBox(_T("핫키 등록 실패!")); 메시지맵에 ON_MESSAGE(WM_HOTKEY, OnHotKey) 한다. 이 때 //}}AFX_MSG_MAP 바깥에 한다. //메세지 받는 프로시져 afx_msg LONG OnHotKey(WPARAM wParam, LPARAM lParam); LONG CMainFrame::OnHotKey(.. 더보기
공유세그먼트 섹션(Section) : PE(Portable Executable, 실행파일) 파일에서 섹션은 PE가 가상주소공간에 로드된 뒤의 실제 내용을 담고 있는 블록이다. 공유 세그먼트는 코드와 데이터 섹션, 익스포트 섹션, 임포트 섹션, 리소스, 섹션들 중 사용자 정의 섹션에 속한다. 보통 프로세스간 데이터 공유를 위함이다. [ 공유세그먼트 ] 다른 주소공간으로 가버린 후킹 DLL과 실행 모듈과 연결할수 있는 방법중 하나. DLL의 일부 값들을 공유 세그먼트로 저장. 공유 세그먼트에 저장된 내용은 프로세스의 경계를 넘어 공유되므로 그 값을 변경하면 DLL이 어떤 프로세스의 주소공간에 있던지 동일한 값을 볼수 있다. [ .cpp FILE ] #pragma data_seg("섹션이름") ... 정의 섹션에 위치할 .. 더보기
DWORD IP to CString, CString IP to DWORD #include inline DWORD CStringIPtoDWORD(CString strIP) { return htonl(inet_addr(strIP)); } inline CString DWORDIPtoCString(DWORD dwIP) { char* strIP; struct in_addr addr; addr.s_addr = (long)dwIP; strIP = inet_ntoa(addr); return (CString)strIP; } 더보기
MFC 창 Dialog 최소화 메시지 OnSysCommand(UINT nID, LPARAM lParam) 함수로 간다. 아마 다이얼로그 소스 코드에 있을것이다^^ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); else { CDialog::OnSysCommand(nID, lParam); } 이런 기본 코드가 있을 것이다^^ 여기에 아래와 같이 처리 하면 될것이다^^>. if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); }else if((nID & 0xFFF0) == SC_MINIMIZE) { //창최소화처리!! } else { CDialog::OnSysComman.. 더보기
MFC 사용자 메시지 사용법 (정의방법) Dialog간의 통신이나 이벤트 발생시에 많이 사용하게 되는 사용자 정의 메세지 사용법. 1. 메세지를 정의한다. - 헤더파일에 다음과 같은 형식으로 정의 #define WM_TEST_MESSAGE WM_USER+10; 2. 메세지를 통해서 호출할 함수의 원형선언 및 구현. - 메세지를 받는 쪽 Dialog의 헤더에 함수원형을 선언한다. 헤더파일의 아래쪽 // Generated message map functions이라고 주석처리된 부분 밑에 아래와 같은 형식으로 선언 afx_msg LRESULT UserMSG(WPARAM wParam, LPARAM lParam); - cpp파일에 함수구현. 3. MESSAGE MAP에 등록. - cpp파일의 메세지 맵에 등록하여 정의된 메세지와 메세지를 통해 호출할 함.. 더보기
다이얼로그에서 에디터박스 엔터처리법!! 1. PreTranslateMessage(MSG* pMsg)를 다음과 같이 오버라이드 한다. 2. 엔터키 입력시 원하는 처리를 추가 한다. BOOL CHelloDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { if (GetDlgItem(IDC_EDIT1) == GetFocus()) { //작업!!! } } } 더보기
MFC 다이얼로그 엔터처리 // 엔터와 ESC키 입력으로 다이얼로그 종료 막기 BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){ // Enter와 Esc 막기 if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || VK_RETURN)) return FALSE; return CDialog::PreTranslateMessage(pMsg);} // 에디트박스에서 엔터 입력시 처리 BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){ // Enter와 Esc 막기 if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || VK_RETURN)) return FALSE.. 더보기
MFC메세지 펌핑 ------- 사용예1 ------- while(1) { netClient.Recv(buffer, 4096); file.Write(buffer, 4096); PUMP_MSG(m_hWnd); } ------- 사용예2 ------- while(1) { zip.Achive(buffer, 4096); PUMP_MSG(m_hWnd); } 저렇게 하면은 파일을 받으실때나 어떤 무한 루프를 돌면서 UI가 맛탱이 가지 않게 돌릴수도 있답니다. 중간에 메시지 펌핑을 해주니깐요... 여담이지만, 알집도 저렇게 한거 같거든요 압축 풀때.... 왜냐믄은 저렇게 하면은 위에 빠를 잡으면 멈춰 버립니다^^;;; ㅋㅋㅋ 뭐 단점이 될려나? 파일 다운로드시엔 뭐 거의 단점이라고 볼수는 없던걸요^^ 느므느므 간단해서 콧방귀를 뀌실라.. 더보기
MFC 프로세스 죽이기 BOOL CGomControl::ProcessKill(CString strProcessName) { HANDLE hProcessSnap = NULL; BOOL bRet = FALSE; PROCESSENTRY32 pe32 = {0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == (HANDLE)-1) return false; pe32.dwSize = sizeof(PROCESSENTRY32); //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다 if (Process32First(hProcessSnap, &pe32)) { BOOL bCurrent = FALSE; MODULEENTRY32 me32 = {.. 더보기
원도우 핸들 얻기 //원도우 핸들 얻기 CWnd *pWnd = AfxGetMainWnd(); HWND hWnd = pWnd->m_hWnd; 더보기
FTP에 파일 업로드 펌자료!! CFtpConnection* ftpCon = NULL; CInternetSession* session; BeginWaitCursor(); session = new CInternetSession(_T("My Session")); try { ftpCon = session->GetFtpConnection(IP, ID, Pass); // 여기서 IP, ID, Pass는 다들 아시겠죠 ^^; } catch(CInternetException* e) { EndWaitCursor(); MessageBeep(0xFFFFFFFF); e->ReportError(); ftpCon = NULL; session->Close(); delete session ; e->Delete(); return FALSE; } EndWaitCur.. 더보기
원도우 화면 캡쳐해서 압축 저장하기 펌자료!! 1. 초기화 과정입니다. BOOL CCaptureDlg::OnInitDialog() { // VC++ 에서 지원한는 Smart Poniter 라는 것으로 구현 했습니다. // 전병선씨가 지은 ATL/COM 프로그램밍 책에 보시면 자세히 설명하는데 // 사 보셔도 좋고요. 앞으로 ATL 을 공부하시는데 도움이 될겁니다. // 연락 주시면 가지고 있는 COM 관련 추천 책들도 알려 드리죠. // InitInstance() 에 AfxOleInit() 가 추가 되어 있는지 확인한다. m_pZlib = IZlibAtlPtr(__uuidof(ZlibAtl)); // 만일 ZlibUtil 이 이벤트를 받고 싶을때 다음의 리마크를 없애세요. // 이벤트 처리는 ZlibUtil 가 같이 샘플로 제공된 createzips.. 더보기
ASSERT() CString strToolBarName; bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); ASSERT(bNameValid); ASSERT(조건)이 들어가게 되면 조건이 만족 하면 그냥 정상진행 그리고 만약 조건이 거짓이라면 오류를 발생시키고 프로그램이 종료 되도록 합니다. 이런 구문은 프로그램 수행시 조건에 대해서 심각한 문제가 발생 할수 있는 상황에서 사용 된니다. 단 이함수는 디버깅 모드에서만 지원하는 함수 이므로 릴리즈 모드에서는 자동으로 이구문이 무시되어 컴파일 됩니다. 더보기
ON_REGISTERED_MESSAGE 다른 프로그램과 메세지를 주고 받는 방법중의 한 가지... RegisterWindowMessage 함수를 사용하는 경우는 아래와 같이 메세지를 등록한다. UINT nRegMsg = RegisterWindowMessage("My Message"); 여기서 입력으로 들어가는 "My Message" 라는 문자열은 메세지를 서로 주고 받기로 한 프로그램간에 서로 약속한 문자열입니다. 이 함수는 메세지를 송신하는쪽이나, 메세지를 수신하는 쪽이나 모두 수행해야 합니다. 메세지가 등록되어 송수신 준비가 되면 SendMessage 또는 PostMessage 함수로 메세지를 전송하면 됩니다. 이때 메세지가 다른 프로그램으로 전달이 되게 하려면 SendMessage 또는 PostMessage함수의 첫번째 입력 인수로 반드.. 더보기
ON_COMMAND, ON_COMMAND_RANGE, ON_UPDATE_COMMAND_UI_RANGE 메세지 처리 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdate.. 더보기
CFile CFile 클래스.... 윈도우즈에서 파일 입출력에 대한 처리방법은 여러가지가 있는데, 가장 쉬 운방법은 MFC 클래스 라이브러리에서 기본적으로 제공되고 있는 표준 다이 얼로그 박스(Common Dialog Box)클래스를 이용하는 것입니다. 표준 다이얼 로그 박스는 문자열의 검색과 치환, 색상의 선택, 폰트의 선택, 프린팅에 대한 기능들도 표준 다이얼로그 박스 클래스로 제공되고 있기 때문에 이러 한 기능들을 프로그램에 지원하고자 할 때는 표준 다이얼로그 박스를 이용 하는 것이 훨씬 용이합니다. Visual C++은 윈도우즈 상에서 보다 효율적으로 파일처리를 할 수 있도록 CFile 클래스와 직렬화(Serialization)기능을 제공하고 있습니다. CFile 클래스 MFC는 표준 파일 처리를 위해 CF.. 더보기
MFC 배열클래스!! MFC 배열클래스 클래스 데이터 형식 CByteArray Byte CDWordArray DWORD CObArray CObject * CPtrArray void * CStringArray CString CUIntArray UINT CWordArray WORD MFC 배열 클래스들의 주요 멤버 함수 함수 기능 SetSize 배열의 크기를 지정합니다 GetSize 현재 배열에 저장된 항목의 개수를 반환합니다. GetAt 지정된 인덱스에 저장된 값을 반환합니다. SetAt 지정된 인덱스에 값을 저장합니다. operator[] GetAt, SetAt 함수의 기능을 할 수 있습니다. 예) array.SetAt(3); -> array[3] 10); 예) int a = array.GetAt(3); -> int a = .. 더보기
원도우 7 빅3 개발 방법 강좌 http://msdn.microsoft.com/ko-kr/ff955783.aspx 더보기
콘솔 디버깅 법!! 프로그램을하다보면 콘솔디버깅이필요할때가있다. 그러나 만약 윈도 프로그램일경우 비주얼씨내의 아웃풋윈도우등에다가 출력을한다. OutputDebugStr(msg); afxDump 더보기
윈도우 버전이 낮다고 컴파일에러 비스타에서만 컴파일이되는군요. 엑스피에서 해볼려니깐. 윈도우 버전이 낮다고 컴파일에러가 나네요. 윈도버전이 최소 비스타로 맞춰져있더군요 엑스피의경우 아래와 같이 수정을 해주면 되더군요 ㅡ.ㅡ;; #ifndef WINVER // Specifies that the minimum required platform is Windows Vista. #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista. #define _WIN32_.. 더보기