2012-11-27 2 views
2

내 프로그램 - 다른 것들 사이는 - 콘솔 창 모양 (주로 창 크기 및 테두리)을 변경합니다.
이제 컴퓨터, 모든 순간에 완벽하게 작동하지만 버추얼에서 응용 프로그램을 실행하거나 다른 컴퓨터에, 내가 할 때 다음과 같다 :C++ : 느린 '유령'창이 나타납니다 ..?

what is happening

이미지의 왼쪽 상단에있는 창은 실제로 창이 아닙니다. 그것은 클릭 할 수없는 창 이미지입니다.
당신은 그것을 통해 바탕 화면에서 선택 사각형을 스트레칭하여 제거 할 수 (마우스 클릭은 통과), 또는 (예) 버튼을 선택하면 그게 받고있다. 또한 창 위로 이동하면 완전히 사라집니다.

이미지의 오른쪽 하단에 검은 색 사각형이 올바르게 표시됩니다 내 콘솔 창입니다.

내 질문은, 어떻게 C로 '유령'창을 제거하는 것입니다 ++?
Google 검색을 시도했지만 모두 내 컴퓨터에서이 문제가 발생하지 않아서 컴퓨터에서 아무 것도하지 않는 ChangeDisplaySettings(0, 0);이며 VirtualBox에서는 처음에는 잠시 나타납니다. 콘솔 창을 전체 화면으로 만든 다음 원래대로 되돌립니다. (응용 프로그램을 처음 실행할 때 화면이 깜박입니다.)
유령 창을 제거하지만 화면이 깜박 거리는 것을 원치 않으므로이 점은 제가 찾고있는 것과 다릅니다.

편집 :
이 문제의 관련 코드가 무엇인지 알 수 없기 때문에 프로그램에서 창 자체를 변경하는 것과 관련이있는 코드를 모두 덤프 할 것입니다.

CSBIEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX); 
GetConsoleScreenBufferInfoEx(hCon, &CSBIEx); 
CSBIEx.dwSize.X = 49; 
CSBIEx.dwSize.Y = 21; 
SetConsoleScreenBufferInfoEx(hCon, &CSBIEx); 
srWnd.Bottom = 20; 
srWnd.Left = 0; 
srWnd.Right = 48; 
srWnd.Top = 0; 
SetConsoleWindowInfo(hCon, TRUE, &srWnd); 
GetClientRect(hWnd, &rClnt); 
rClnt.top += 1; 
rClnt.bottom -= 2; 
rClnt.right -= 1; 
SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP); 
exStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE); 
exStyle &= ~WS_EX_CLIENTEDGE; 
SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle); 
BringWindowToTop(hWnd); 
SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right/2) - rClnt.right/2) - 1, (rScr.bottom/2) - rClnt.bottom/2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE); 
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1); 
ShowWindow(hWnd, SW_SHOWNORMAL); 
//ChangeDisplaySettings(0, 0); 

2 일 편집 :
이 어떤 도움이 있는지 모르겠어요,하지만 난 ChangeDisplaySettings(NULL, 0); 대신 ChangeDisplaySettings(0, 0);의를 사용하는 경우는 아무것도하지 않는 것으로 나타났습니다. NULL#define d 0입니다.
아무도 알아낼 수 없다면, 아마도 ChangeDisplaySettings(0, 0);을 사용하게 될 것입니다.

+0

우리에게 보여줄 수있는 [짧고, 잘 들어 있고 정확한 예] (http://sscce.org/)를 만들 수 있습니까? 코드를 보지 않고 무엇이 잘못되었는지를 추측하는 것은 매우 어렵습니다. –

+0

이것은 소유자의 뒤에서 창 설정을 변경하는 단점입니다. 창 프로 시저가 수행 한 작업을 알지 못해서 상황이 올바르게 그려지지 않거나 지워지지 않습니다. – Deanna

+0

@ JoachimPileborg 필자는 내 자신의 컴퓨터에서이 코드를 실제로 복제 할 수 없기 때문에 관련 코드를 제공하기가 정말로 어렵지만 가능한 한 최선의 코드를 추가하려고합니다. 잠시만. –

답변

2
InvalidateRect(NULL, NULL, TRUE); 

내가 찾고있는 것이 었습니다.

0

컴퓨터에서 "Aero"테마를 실행하고 있습니까? 그렇다면 클래식 테마로 전환하십시오. Betcha 당신은 문제점 자체를 명백하게 볼 것이다. 귀하의 응용 프로그램이 제대로 WM_PAINT 메시지를 처리하지 않는 것 같아요. Aero 테마는 WM_PAINT 메시지를 훨씬 적게 전송합니다. OS는 저장하는 비트 맵을 사용하여 페인팅을 수행합니다.

편집 : 새로운 차원 이러한 호출 시도 :

BOOL WINAPI SetConsoleDisplayMode(
    _In_  HANDLE hConsoleOutput, 
    _In_  DWORD dwFlags, 
    _Out_opt_ PCOORD lpNewScreenBufferDimensions 
); 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033%28v=vs.85%29.aspx

BOOL WINAPI SetConsoleWindowInfo(
    _In_ HANDLE hConsoleOutput, 
    _In_ BOOL bAbsolute, 
    _In_ const SMALL_RECT *lpConsoleWindow 
); 

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686125%28v=vs.85%29.aspx

는 또한 DispatchMessage로 자신에게 WM_PAINT 메시지를 전송 시도 할 수 있습니다.

+0

당신은 절대적으로 옳습니다. 에어로를 끈 후에도 컴퓨터의 버그를 볼 수 있습니다. 문제는 WM_PAINT 메시지 (또는 그 문제에 대한 메시지)를 처리 할 수 ​​없기 때문에 콘솔 응용 프로그램이라는 것입니다. 어떻게해야합니까? –