2009-07-21 7 views
5

MFC 대화 상자에서 일부 컨트롤을 동적으로 만들어야합니다. 지금까지는 생성이 제대로 작동하지만 동적으로 생성 된 컨트롤은 리소스 편집기로 만든 컨트롤과 다르게 보입니다. 일부 컨트롤은 다른 방식으로 작동합니다. 내 생각에, 생성 된 코드가 수행하는 초기화 중 일부가 누락되었습니다.MFC 컨트롤을 동적으로 생성 할 때 리소스 편집기에서 사용하는 스타일을 다시 만드는 방법은 무엇입니까?

현재 나는 CStaticCEdit 컨트롤 만 만듭니다. 둘 다 동적으로 만들 때 표준 Windows 글꼴을 사용하지 않습니다 (글꼴이 Windows 95 이전에 사용 된 기본 글꼴과 비슷하게 보입니다. 올바르게 기억하는 경우).

또한 CEdit 컨트롤은 리소스 편집기로 컨트롤을 만들 때와 다르게 동작합니다. 동적으로 생성 된 컨트롤은 텍스트 길이를 보이는 크기로 제한하는 것으로 보입니다. SetWindowText()으로 긴 텍스트를 설정하고 GetWindowText()으로 전체 텍스트를 다시 읽을 수 있지만 표시된 크기보다 긴 텍스트를 입력 할 수는 없습니다. CEdit 리소스 편집기에서 만든 컨트롤이 다르게 동작합니다. 사용자가 표시 할 수있는 것보다 긴 텍스트를 입력하면 입력 된 텍스트가 컨트롤 내에서 "스크롤"됩니다 (스크롤 막대가없고 단 한 줄 컨트롤처럼).

컨트롤에 SetLimitText()을 호출하여이 문제를 해결했지만 동작을 변경하지 않았습니다.

컨트롤

은 대화 상자 클래스에 정의 된 배열로 저장됩니다

컨트롤의 생성 대화 수준의 OnInitDialog() 방법에서 발생

CStatic** m_pLabels; 
CEdit** m_pEdits; 
: 대한

for (int i = 0; i < max; i++) 
{ 
    m_pLabels[i] = new CStatic(); 
    m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT, 
    CRect(10, 10 + i * 30, 130, 35 + i * 30), this); 

    m_pEdits[i] = new CEdit(); 
    m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER, 
    CRect(133, 10 + i * 30, 350, 35 + i * 30), this, i + 100); 
    m_pEdits[i]->SetLimitText(499); 
    m_pEdits[i]->SetWindowText("value to be edited"); 
} 

주셔서 감사합니다 도움!

+0

각 질문에 대답 할 때 "받아 들인 답"으로 선택해야하는 답을 모르겠습니다. 여기 정상적인 절차는 무엇입니까? – Xperimental

+0

좋은 질문입니다 - 확실하지 않습니다! 가장 유익한 것을 선택하고 받아 들일 것을 제안합니다. 당신이 한 일에 대해 설명 할 수있는 몇 가지 의견이 있습니다. – DavidK

+0

또 다른 가능한 해결책은 나 자신이 질문에 대답하고 대답을 인용 한 다음 내 대답을 받아 들인 답으로 선택하는 것입니다. 아니면 "최종 솔루션에 대한 다른 대답 읽기"와 같은 대답을 할 수 있습니다. – Xperimental

답변

-1

제 문제에 대한 해결책은 DavidKsharptooth입니다.

+0

주 댓글 영역에 명시된 바와 같이, 나는 "받아 들여진"답변으로 선택할 답을 알지 못했습니다. 원래 답변을 게시하여 내 답변을 게시하는 것이 해당 문제에 대한 유효한 해결책이 아닌 경우 의견을 게시하십시오. – Xperimental

4

내가 할 수있는 가장 좋은 방법은 대화 상자 편집기를 통해 대화 상자에 컨트롤을 추가하고 시각적 스타일을 원하는 것으로 설정 한 다음 텍스트 편집기에서 .rc 파일을 열고 해당 스타일을 복사하는 것입니다. 거기에서 통제. 이렇게하면 대화 상자 편집기를 통해 추가하는 컨트롤에 훨씬 더 가까운 컨트롤을 만들 수 있습니다.

는 예를 들어, 확인을 갖는 대화에 간단한 버튼을 가하고 후/버튼과 텍스트 컨트롤을 취소, 내 대화 상자가 .rc 파일에 다음과 같습니다 : 나는 모든 정보를 가지고 있기 때문에,

IDD_MFCAPP_DIALOG DIALOGEX 0, 0, 320, 200 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
EXSTYLE WS_EX_APPWINDOW 
CAPTION "MFCApp" 
FONT 8, "MS Shell Dlg", 0, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,263,7,50,16 
    PUSHBUTTON  "Cancel",IDCANCEL,263,25,50,16 
    CTEXT   "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8 
    PUSHBUTTON  "Button1",IDC_BUTTON1,43,17,50,14 
END 

지금 대화 상자가 백엔드에서 어떻게 생성되었는지에 관해서는 코드를 통해이 동작을 복제 할 수 있습니다.

P. 물론, 별도의 테스트 프로젝트에서이 작업을 수행 할 것입니다.

+0

그래, 보통 나는 그렇게 할거야. – djeidot

5

동적으로 생성 된 컨트롤은 항상 처음에 주식 글꼴을 얻을 : 일반적인 접근 방식은 부모 대화 상자의 글꼴 컨트롤의 글꼴을 설정하는 것입니다 : 당신은 편집 상자에 ES_AUTOHSCROLL 스타일을 추가 할 필요가

pEdits[i]->SetFont(GetFont()); 
+0

빠른 해결책을 가져 주셔서 감사합니다. – Xperimental

1

같은 것을. 이 스타일은 상자가 표시 할 수있는 것보다 많은 텍스트를 입력 할 때 텍스트를 왼쪽으로 스크롤 할 책임이 있습니다.

텍스트 편집기에서 .rc 파일을 열고 컨트롤의 스타일을 올려 보면 이러한 점을 찾는 데 도움이 될 수 있습니다.

+0

고마워요. 어떻게 든 스타일 플래그를 놓쳤을 것입니다. 왜냐하면 전에 왜 .rc 파일을 열어서 그 접근법을 시도 했었는지, 왜 그런지 모르겠습니다. – Xperimental

관련 문제