How to Use MFC Grid control 2.27

Programming/MFCGridCtrl 2016. 8. 12. 16:13 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

How to Use MFC Grid control 2.27


http://www.codeproject.com/Articles/8/MFC-Grid-control-2-27

1. Download


MFC Grid control 2.27

6 May 2010 CPOL
A fully featured MFC grid control for displaying tabular data. The grid is a custom control derived from CWnd





2. Essential Include Files



Files

To use the Grid control in your project you will need to add a number of files to your project:

gridctrl.cpp, gridctrl.hMain grid control source and header files.
gridcellbase.cpp, gridcellbase.hMain grid cell base class.
gridcell.cpp, gridcell.hMain grid cell default class implementation.
CellRange.hDefinition of CCellID and CCellRange helper classes.
MemDC.hKeith Rule's memory DC helper class.
InPlaceEdit.cpp, InPlaceEdit.hIn-place edit windows source and header files.
GridDropTarget.cpp, GridDropTarget.hGrid control OLE drag and drop target. Only necessary if you don't define GRIDCONTROL_NO_DRAGDROP in gridctrl.h
Titletip.cpp, Titletip.h

Titletips for cells, from Zafir Anjum. Only necessary if you don't define GRIDCONTROL_NO_TITLETIPS in gridctrl.h



3. Essential Include Files Add to Project 







4. Custom Control Add to Dialog




ID : IDC_GRID


Class : MFCGridCtrl (No CGridCtrl)


if you use CGridCtrl, you can see this error








5. Make Member Variable m_Grid



Dlg.h


- Include


#include "GridCtrl.h"


Make Member Variable m_Grid


CGridCtrl m_Grid;




Dlg.cpp


- Include


#include "GridCtrl.h"





6. IDC_GRID Connect with Member Variable




DDX_GridControl(pDX, IDC_GRID, m_Grid);


DDX_GridControl Function defined in GridCtrl.h









336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

error C4996: 'xxx': deprecated로 선언되었습니다.



deprecated란

기존의 함수나 클래스가 필요없어져서 삭제하려고 할 때 이미 많은 곳에서 사용 중이라서 바로 삭제하기 까다로운 경우가 있다. 이런 경우 바로 삭제하지 않고 삭제할 함수나 클래스를 사용하지 않도록 유도한 후 사용하는 곳이 없어지는 시점이 왔을 때 삭제하는 방식을 사용할 수 있다. 이 때 사용할 수 있는 기능이 deprecated 기능이다.


    //함수
    __declspec(deprecated) void DeplacatedFunction()
    {
    }

    //구조체
    struct __declspec(deprecated) DeplacatedStruct
    {
    };

    //클래스
    class __declspec(deprecated) DeplacatedClass
    {
    };

     



    이렇게 설정하면 컴파일시 deprecated로 설정된 것이 사용된 곳에서 각각 다음과 같은 메시지가 출력된다.

    warning C4996: ‘DeplacatedFunction’: deprecated로 선언되었습니다.
    ‘DeplacatedFunction’ 선언을 참조하십시오.

    warning C4996: ‘DeplacatedStruct’: deprecated로 선언되었습니다.
    ‘DeplacatedStruct’ 선언을 참조하십시오.

    warning C4996: ‘DeplacatedClass’: deprecated로 선언되었습니다.
    ‘DeplacatedClass’ 선언을 참조하십시오.



    그러나 의도적으로 Deplacated 로 설정된것을 사용하고자 한다면



    #define _CRT_SECURE_NO_DEPRECATE


    #pragma warning(disable:4996)


    둘 중의 하나를 선언하면 된다.





    deprecated (C++)

    Visual Studio 2005

    (Microsoft specific) With the exceptions noted below, the deprecated declaration offers the same functionality as the deprecatedpragma:

    • The deprecated declaration lets you specify particular forms of function overloads as deprecated, whereas the pragma form applies to all overloaded forms of a function name.

    • The deprecated declaration lets you specify a message that will display at compile time. The text of the message can be from a macro.

    • Macros can only be marked as deprecated with the deprecated pragma.

    If the compiler encounters the use of a deprecated identifier, a C4996 warning is thrown.

    Example

    The following sample shows how to mark functions as deprecated, and how to specify a message that will be displayed at compile time, when the deprecated function is used.

    // deprecated.cpp
    // compile with: /W1
    #define MY_TEXT "function is deprecated"
    void func1(void) {}
    __declspec(deprecated) void func1(int) {}
    __declspec(deprecated("** this is a deprecated function **")) void func2(int) {}
    __declspec(deprecated(MY_TEXT)) void func3(int) {}
    
    int main() {
       func1();
       func1(1);   // C4996
       func2(1);   // C4996
       func3(1);   // C4996
    }
    

    The following sample shows how to mark classes as deprecated, and how to specify a message that will be displayed at compile time, when the deprecated class is used.

    // deprecate_class.cpp
    // compile with: /W1
    struct __declspec(deprecated) X {
       void f(){}
    };
    
    struct __declspec(deprecated("** X2 is deprecated **")) X2 {
       void f(){}
    };
    
    int main() {
       X x;   // C4996
       X2 x2;   // C4996
    }


    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    MFC Dialog 에 OnInitDialog 추가하기





    CDialog::OnInitDialog

    이 메서드를 호출 하에서 여 WM_INITDIALOG 메시지.

    virtual BOOL OnInitDialog( );
    

    Windows를 보냅니다는 WM_INITDIALOG 중 대화 상자에 메시지를 만들기CreateIndirect, 또는 DoModal 대화 상자를 바로 표시 되기 전에 발생 하는 호출을.

    대화 상자 초기화 될 때 특수 처리를 수행 하려는 경우이 메서드를 재정의 합니다. 재정의 된 버전에서 먼저 기본 클래스를 호출OnInitDialog 하지만 반환 값을 무시 합니다. 일반적으로 반환 합니다 TRUE 에서 메서드를 재정의 합니다.

    Windows 호출을 OnInitDialog 일반 표준 글로벌 대화 상자 프로시저 모든 Mfc 라이브러리 대화 상자를 사용 하 여 함수. 사용자 메시지 맵을 통해이 함수를 호출 하 고이 메서드에 대 한 메시지 맵 엔트리는 필요 하지 않습니다 따라서.



    Dialog 의 리소스뷰에서 OnInitDialog 를 추가 하려고 하면


    메시지와 컨트롤 이벤트에서는 보이지 않는다.



    불가능 한것이 아니고 다른 위치에서 하여야한다.




    클래스 뷰에서


    해당 다이얼로그의 클래스 함수를 선택 후


    속성창을 보면


    [재정의] 버튼이 있다.




    재정의 화면 안에


    OnInitDialog 가 존재한다.





    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    Visual Studio 2013에서 MSFlexGrid 추가 할 때 Error




    Dialog 에서 ActiveX 컨트롤 삽입한다.



    그러면 이처럼 FlexGrid Control 이 삽입이 될것이고,





    FlexGrid Control 을 코드 내부에서 변수로 사용하고자 하면


    일단 해당 Dialog 를 클래스로 만든다.








    Dialog 클래스가 만들어지고나면



    FlexGrid 의 변수를 만들어준다.







    이제 FlexGrid Control 을 잘 사용하면 된다.







    ...



    하지만 여기서 에러가 난다.








    error C4146: 단항 빼기 연산자가 부호 없는 형식에 적용되었습니다. 결과는 역시 unsigned입니다.







    flexOLEDropEffectScroll = -2147483648 


    이 구문의 문제이다.




    flexOLEDropEffectScroll = -2147483648LL



    으로 바꾸어주면 잘 동작한다.


    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    성동구 인근 지역 프로그래밍 과외 합니다.


    지역 : 서울 성동구 인근


    종목 : 프로그래밍, 정보올림피아드, CCNA, CCNP


    경력 : 지도학생) 2013 초등부 정보올림피아드 전국대회 은상 수상

            지도학생) 정보올림피아드 본선 진출 다수


             전) 서울 서울특별시립종합직업전문학교 외부강사

             전) 천안 그린컴퓨터학원 프로그래밍 강사

             전) 한국기술교육대학교 대학원 컴퓨터공학부 박사과정 수료

             전) 청주 그린컴퓨터학원 프로그래밍 강사

             전) 아산소재 대학교 시간강사

             전) 천안소재 대학교 시간강사



             현) 한국기술교육대학교 평생능력개발 이러닝 운영강사

             현) IT기업 연구소 재직중




    자세한 문의는


    tansanc23@gmail.com 으로 문의해 주세요.

    공일공-구구육이-일사일칠



    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    출처 : http://www.gamedevforever.com/282



    스코프를 벗어난 객체 주시하기

    디버깅을 하다 보면 스코프를 벗어난 객체를 계속 주시하고 싶을 때가 있습니다. 하지만 비쥬얼 스튜디오의 조사식 창(Watch Window)에서는 입력한 객체가 스코프를 벗어나면 비활성화가 되어 더이상 값을 확인 할수 없게 되어버리죠. 이 때, 조사식에 주시 하고픈 객체의 포인터를 입력하면, 해당 객체가 스코프를 벗어났더라도 (해당 객체가 살아 있다면) 지속적으로 값을 확인할 수 있습니다.



    위 코드를 보면 mHyuna 객체는 이미 스코프를 벗어나 조사식 창에서 비활성화가 되었지만, (CHyuna*)0x0031fe2c 식으로 직접 객체의 주소를 참조하여 스코프를 벗어난 객체의 값을 확인할 수 있습니다.


    배열값 확인

    간혹 매우 큰 크기의 배열을 사용할때가 있습니다. 대략 1만개라고 해보죠. 이 배열 내부의 값을 확인하려면 어떨까요? 1만개의 배열을 일일히 확인하려면 엄청나게 스크롤링을 해야 할 것 입니다.



    이럴때 범위식을 사용하여 특정 구간의 값만을 확인하는 방법이 있습니다. 배열명, 범위 식으로 조사식 창에 입력하여주면 그 범위 만큼의 배열만 보여주는 것이죠. 또한 포인터 연산을 통해서 특정 범위 부터의 값도 확인할 수 있습니다.



    CRT 라이브러리를 활용한 메모리 누수 탐지

    메모리 누수는 항상 골치 거리입니다. 수많은 코드들 중에서 어디서 메모리가 새는지 원인을 찾기도 힘들죠. CRT 라이브러리를 활용하여 메모리 누수 지점을 찾기 위한 방법이 있습니다. 먼저 아래와 같이 CRT 라이브러리를 사용하기 위한 헤더를 선언 해줍니다. 그리고 메모리 누수 체크를 위한 플래그를 선언 해줍니다( _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); ).



    위 코드를 보시면 일부러 char[8] 만큼의 메모리를 할당 해주고, 해제를 안하고 있습니다. 이 코드를 실행시키면 아래와 같이 출력 창에서 메모리 누수가 탐지 되었다는 메시지가 나타납니다.



    출력창 메시지에서 빨간 네모 박스의 숫자를 잘 기억해두세요. 이 것이 메모리가 누수되는 위치를 가리키고 있는 값입니다. 이제 이 값을 이용해 메모리 누수 위치를 찾아보도록 하겠습니다.


    우선 프로그램 아무 곳에나 중단점을 걸고 디버깅 모드로 들어갑니다. 되도록 이면 프로그램의 시작 점에 거는 것이 좋습니다. 디버깅 모드에 들어갔으면 아래와 같이 조사식 창에 {,,msvcrXXXd.dll}_crtBreakAlloc 을 입력해줍니다. 여기서 XXX는 비쥬얼 스튜디오 버전을 적어줍니다. 2008일 경우 msvcr90d.dll, 2010일 경우 msvcr100d.dll, 2012 일 경우 msvcr110d.dll 입니다.



    조사식 창에 위의 구문을 입력하면 처음에는 값이 -1로 나올 것입니다. 여기에 출력창에 나왔던 메모리 누수 위치값을 입력해줍니다. 위의 예제에서는 108 이죠. 그 다음 F5를 눌러 프로그램 실행을 재개합니다. 


    그러면 어디선가 중단점이 걸립니다. 이제 콜스택을 확인해봅니다.



    중단점이 걸린 곳은 msvcr110d.dll 모듈입니다. 이 부분은 디버깅을 위한 곳이니 신경 쓰지 마시고, 밑으로 따라 내려가 보시면 실제 작업 영역 호출 부분이 있습니다. 이 곳으로 따라 가보면...



    짜잔~ 메모리를 할당하고 해제 하지 않은 부분을 찾아냈습니다. 이렇게 CRT 라이브러리를 이용하여 메모리 누수 원인을 찾아 낼수 있습니다.


    값이 변경 되는 위치 찾기

    디버깅을 하다보면 특정 변수가 어디서 값이 변경 되는 지를 알고 싶을 때가 있습니다. 변수를 사용하는 곳을 전부 검색하여 중단점을 걸어서 볼수도 있지만 데이터 중단점 기능을 이용하면 값을 변경 하는 곳을 손쉽게 찾을 수 있습니다.


    먼저 추적 하고 싶은 데이터의 주소를 파악합니다.



    그 다음 비쥬얼 스튜디오의 디버그 -> 새 중단점 -> 새 데이터 중단점을 선택합니다. 여기에 위의 데이터 주소 값을 입력 해줍니다. 타입의 크기 값에 주의 합니다.



    중단점을 추가 한 후, F5를 눌러 실행을 재개합니다. 그러면 어디선가 해당 데이터가 값이 변경 되면 아래와 같이 중단점이 작동하게 됩니다.



    위의 예제에서는 SexyUp 함수에서 해당 데이터를 변경하는 것을 알아냈습니다.


    출처 및 참고

    Code Project Article - 10 Even More Visual Studio Debugging Tips for Native Development

    Code Project Article - 10 More Visual Studio Debugging Tips for Native Development

    MSDN - CRT 라이브러리를 사용하여 메모리 누수 찾기

    'Programming > C,CPP,CS' 카테고리의 다른 글

    CRuntieClass Reflection  (0) 2016.08.17
    error C4996: 'xxx': deprecated로 선언되었습니다.  (0) 2016.08.12
    C++ Standard library has many containers  (0) 2016.07.19
    Log4cxx Build in VS2013  (0) 2016.06.29
    Log4cxx Tutorial  (0) 2016.06.28

    MFC 4대 Class간 참조

    Programming/MFC 2016. 7. 25. 08:55 Posted by TanSanC
    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

     

    4 Class간 참조

    //각각 헤더파일 include

     









    #include "MainFrm.h" //메인프레임 헤더파일

     

    #include "ClassDoc.h"   //Doc클래스 헤더파일

     

    #include "ClassView.h" //View include 할때는 반드시 Doc 헤더파일이 위에있어야한다

     

    #include "Class.h" //APP Class 의 헤더파일

     

     









    void CClassView::OnMenuView() //뷰클래스

     

    CClassApp *pApp = (CClassApp *)AfxGetApp();   //View -> App

    CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();  //View -> MainFrm

     

    //View -> MainFrm -> Doc

     

    CClassDoc *pDoc = (CClassDoc *)pMain->GetActiveDocument();

     

    CClassDoc *pDoc = (CClassDoc *)GetDocument();         //View -> Doc

     

     









    //MainFrame 클래스

     

    CClassView *pView = (CClassView *)GetActiveView();  //MainFrm -> View

     

    CClassDoc *pDoc = (CClassDoc *)GetActiveDocument();  //MainFrm -> Doc

     

    CClassApp *pApp = (CClassApp *)AfxGetApp(); //MainFrm -> App

     

     









    //Doc 클래스

     

    CClassApp *pApp = (CClassApp *)AfxGetApp(); //Doc -> App

     

    CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd(); //Doc -> MainFrm

     

    // Doc -> MainFrm -> View

     

    CClassView *pView = (CClassView *)pMain->GetActiveView();

     

    CClassView *pView = (CClassView *)m_viewList.GetHead();      // Doc -> View

     

     











    //App 클래스

     

    CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd(); //App -> MainFrm

     

    //App -> MainFrm -> View

     

    CClassView *pView = (CClassView *)pMain->GetActiveView();

     

    //App -> MainFrm -> Doc

     

    CClassDoc *pDoc = (CClassDoc *)pMain->GetActiveDocument();








    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    How to prevent MFC dialog closing on Enter and Escape keys?


    There is an alternative to the previous answer, which is useful if you wish to still have an OK / Close button. If you override the PreTranslateMessage function, you can catch the use of VK_ESCAPE / VK_RETURN like so:



    BOOL CMainDialog::PreTranslateMessage(MSG* pMsg)

    {


    if (pMsg->message == WM_KEYDOWN)

    {

    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)

    {

    return TRUE;                // Do not process further

    }

    }


    return CDialogEx::PreTranslateMessage(pMsg);

    }




    이렇게 수정하여야 한다.




    PreTranslateMessage 함수를 생성하는 방법은


    1. Enter, ESC 키를 차단할 DialogClass 를 우클릭


    2. [클래스 마법사] 를 켠다.


    3. [가상 함수]


    4. 가상 함수 탭에서 PreTranslateMessage 를 선택


    5. [함수 추가]


    6. 추가된 함수에


    if (pMsg->message == WM_KEYDOWN)

    {

    if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)

    {

    return TRUE;                // Do not process further

    }

    }


    추가 작성




    C++ Standard library has many containers

    Programming/C,CPP,CS 2016. 7. 19. 10:37 Posted by TanSanC
    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    C++ Standard library has many containers. Depending on situation you have to choose one which best suits your purpose. It is not possible for me to talk about each of them. But here is the chart that helps a lot (source):






    C++ 스탠다드 라이브러리에 많은 컨테이너 들이 있다.
    흔히 사용하는 List, Stack, Vector 뿐만 아니라 다양한 컨테이너들이 존재하는데, 그 컨테이너들을 언제 사용해야 할지를 FlowChart 를 따라가면서 쉽게 선택할 수 있다. 
















    enter image description here




    Log4cxx Build in VS2013

    Programming/C,CPP,CS 2016. 6. 29. 15:01 Posted by TanSanC
    336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

    Log4cxx Build in VS2013


    1. DownLoad FIles


    Apache log4cxx 

    Apache Portable Runtime (APR)
    Apache Portable Runtime-util (APR-util)

    GNU Sed


    apache-log4cxx-0.10.0.zip

    apr-1.5.2-win32-src.zip

    apr-util-1.5.4-win32-src.zip

    sed-4.2.1-setup.exe




    2. Installation


    2.1. Decompress APR, APR-util, log4cxx File in same folder
    ...\log4cxx\apr
    ...\log4cxx\apr-util
    ...\log4cxx\log4cxx

    2.2 Install GNU sed
    Run "sed-4.2-1-setup.exe"
    Add environment variable %PATH% : "C:\Program Files\GnuWin32\bin" 

    2.3 in "cmd.exe" move to "...\log4cxx" folder
    Run "configure.bat" in "cmd.exe"
    Run "configure-aprutil.bat" in "cmd.exe"

    2.4. Compile "C:\work\log4cxx\log4cxx\projects\log4cxx.dsw"
    Result : log4cxx.dll, log4cxx.lib
    ("...\log4cxx\projects\Debug or Release")

    config1.

    log4cxx 프로젝트 속성 / 구성 속성 / 링커 / 입력 / 추가 종속성 : 
    apr.lib,
    aprutil.lib,
    xml.lib
    추가

    config2.
    apr,aprutil,xml 프로젝트 속성/ 구성 속성/ 라이브러리 관리자/ 일반/출력 파일
    apr.lib,
    aprutil.lib,
    xml.lib
    이름과 같은지 확인(apr-1.lib 인경우가 있음)

    config3.
    log4cxx 프로젝트 속성 / 구성 속성 / C/C++ / 추가 포함 디렉터리 : 
    ..\src\main\include
    ..\..\apr\include
    ..\..\apr-util\include

    config4.
    log4cxx 프로젝트 속성 / 구성 속성 / 링커 / 추가 라이브러리 디렉터리 : 
    ..\..\apr\LibD
    ..\..\apr-util\LibD
    ..\..\apr-util\xml\expat\lib\LibD

    Error1. C2252

    LOG4CXX_LIST_DEF( ... , ... );

    move to out of class area, in same namespace

    but, 

    LOG4CXX_LIST_DEF(ConnectionList, Connection);  

    move with 

    typedef log4cxx::helpers::SocketPtr Connection; 


    Error2. C2039

    "LoggingEvent::KeySet" change to "KeySet"


    Error3. LNK2019

    프로젝트 속성 / 구성 속성 / 링커 / 입력 / 추가 종속성 : Rpcrt4.lib 추가






    'Programming > C,CPP,CS' 카테고리의 다른 글

    비쥬얼 스튜디오 디버깅 팁 ( Visual Studio Debugging Tips )  (0) 2016.08.09
    C++ Standard library has many containers  (0) 2016.07.19
    Log4cxx Tutorial  (0) 2016.06.28
    Log Librarys  (0) 2016.06.27
    ATL,CPP,C# dll 배포  (0) 2016.05.27