2012-11-11 5 views
1

약 20 개 (!) 년 동안 복잡한 C 프로그램을 작성했습니다. 지금까지 나는 모든면에서 당시와 마찬가지로 잘 작동했다. 아마도 윈도우 95에서 돌아갔다.이전 프로그램에서 라디오 버튼을 선택하지 않았습니다.

이제 다시 사용해야한다. 불행하게도 그 안에있는 라디오 버튼은 더 이상 제대로 작동하지 않는 것처럼 보입니다 (보통 푸시 버튼은 모두 올바르게 작동합니다). 라디오 버튼을 클릭하면 윈도우가 내 클릭을 확인하는 것과 같이 버튼의 텍스트 주변에 점선이 표시되고 단추의 원이 내 손가락이 버튼에있는 동안 회색으로 표시된다는 의견이 표시됩니다. 하지만 손가락을 떼면 선택한 버튼이 변경되지 않은 것을 알 수 있습니다.

의심의 여지는 내가 Windows 95에서 작동하지만 더 이상 최신 버전의 Windows에서 작동하지 않는 나쁜 습관이 생겨났다는 것이지만 내가 잘못한 것을 해결하는 데 어려움을 겪고 있습니다. 어떤 아이디어?

EDIT :이 프로그램에서 메시지 처리가 복잡하여 악몽 이었기 때문에 관련 코드를 추출하기가 어렵습니다. 많은 버튼이 런타임에 프로그래밍 방식으로 생성되었으며 프로그램이 다른 작동 모드에있을 때 다른 메시지 루프가 작동했습니다. 이 프로그램은 특정 유형의 실험을 실행하기위한 맞춤식 환경이었습니다. 자체적으로 내장 된 인터프리터 언어도있었습니다! 그래서 나는 "47 행의 세미콜론 대신 쉼표를 사용해야합니다."와 같은 대답을 기대하지는 않지만 "내 프로그램에서 한 번 비슷한 증상을 보았고 ....." .. 또는 아마도 "점선 된 사각형이 나타나는 것은 프로세스 AAA가 발생했지만 BBB 단계가 잘못되었을 수도 있음을 의미합니다."

편집 : 나는 라디오 버튼을 사용할 때 확인하는 간단한 두 가지가 있습니다

char *process_messages_one_at_a_time() 
{ 
    MSG msg; 
    int temp; 

    temp = PeekMessage(&msg,winh,0,0,PM_NOREMOVE); 

    if (temp) 
    { 
     GetMessage (&msg, NULL, 0, 0); 
     if (msg.message == WM_LBUTTONUP) 
     { 
      mouse_just_released_somewhere = TRUE; 
     } 

     TranslateMessage (&msg); 
     DispatchMessage (&msg); 
    } 

    if (button_command_waiting) 
    { 
     button_command_waiting = FALSE; 
     return (button_command_string); 
    } 
    else 
    { 
     return (NULL); 
    } 
} 
+1

우리가 볼 수있는 코드가 있습니까? – ChrisF

+1

사람들이 자신이 어떤 API를 볼 수 있도록 SSCE ([짧고, 자기 포함, 올바른 (컴파일 가능한) 예] (http://sscce.org/))를 제공해야하는 경우처럼 들립니다.)를 사용하여. 하지만 코드를 단일 라디오 버튼 및 가능한 최소 기타 코드로 줄여야합니다. MSDN에서 사용하려는 API에 대한 정보를 찾았습니까? –

+0

나는 SSCE를 좋아하고 그 전에 많은 시간을 게시했지만,이 경우에는 하나가되면 힘들어 질 것입니다. 그러나 저는 제 코드로 돌아가서 제가 할 수있는 것을 볼 것입니다. – Mick

답변

2

... 오류를 포함의 나 몇 가지 핵심 코드를 추출하는 데 성공했습니다. 첫 번째는 각각에 BS_AUTORADIOBUTTON 속성이 설정되어 있는지 확인하는 것입니다. 두 번째는 탭 순서의 첫 번째 단추와 단추 집합 뒤에 오는 다음 컨트롤 (일반적으로 그룹 상자)이 WS_GROUP 속성을 설정하고 다른 단추는 분명히 나타나는지 확인하는 것입니다.

0

프로그램을 실행하고 싶으면 "호환성 모드"를 제안하십시오. 당신이 소프트웨어의 더 큰 기대 수명이있는 경우

http://www.howtogeek.com/howto/windows-vista/using-windows-vista-compatibility-mode/

그러나, 당신은 그것을 다시 작성 할 수 있습니다.이 때문에 몇 가지 요인의 복잡성 또는 초기 쓰기의 작업 근처에 어디하지 않습니다 다시 쓰기 :

  • 프로그램의 요구 사항을 개발하는 소프트웨어 패키지를 만드는 데 필요한 작업의 상당 부분 (요구 사항은 이미
  • 많은 코드가 이미 작성되고 일부만 필요할 수있는 약간
  • 새로운 라이브러리 구성 요소는 기존의 코드베이스의 부분에보다 안정적인 대안이 될 수있다 업데이트하기 위해 리팩토링 할) 할 당신은거야
  • 현재 라이브러리 기능을 사용하여 현재 응용 프로그램을 작성하는 방법을 배웁니다.
  • 코드를 주석 처리하거나 일반적으로 코드를 리팩토링하고 정리할 수 있습니다 (따라서 예상 수명 연장을 위해 유지 관리가 더 편리해집니다).
  • 코드베이스는 두 요구 사항의 추가 변경 사항에 대해 앞으로도 유지 보수가 가능합니다. 및 운영 체제 (이 업데이트됩니다 모두 때문에 당신이 할 수있는 기회 했어 때문에 전체 코드베이스 재를 이해) 할 수

희망 ...

1

몇 가지 제안 :

  • 나는 spy ++를 사용하여 해당 대화 상자의 메시지, 특히 라디오 버튼 컨트롤을 모니터링하려고합니다. 프로그램이 보내고있는 BM_SETCHECK를 볼 수 있을지 궁금해합니다. (예를 들어 어딘가에서 프로그래밍 방식으로 버튼을 선택 취소하고있는 것입니다).
  • 코드가 Windows 버전 번호를 검사 할 수 있습니까? 나는 버전 확인 호환성을 보장하기 위해 ==를 사용해야했던 ==을 몇 번 사용했다.
  • 컨트롤을 하위 클래스로 지정 하시겠습니까? 기억이 안 나지만 하위 분류가 잘못 될 수있는 몇 가지 방법이 있습니다. 새 버전의 Windows가 포함될 때까지는 효과가 즉시 눈에 띄지 않습니다.
  • 소유자 - 컨트롤 그리기? 새로운 Windows GUI 스타일에서는 소유자 그리기 작업이 쉽지 않습니다.

그런 오래된 코드로 작업하면 홍수가 아닌 비트와 조각으로 나에게 다시 돌아옵니다. 그래서 그때 내가했던 것을 내게 밝히기까지는 보통 시간이 걸립니다.

관련 문제