2012-08-05 2 views
0

나는 char 배열을 사용하여 동적 메시지 박스를 만들려면,하지만 난 진 U 타입 (UINT)와 함께 몇 가지 문제가있다 ..동적 메시지 박스 사용 변수 (C++)

당신이 내 코드를 볼 경우, 내가 먼저 문자를 문자열 | 구분 기호가 있으며 배열 "a"로 파싱됩니다. 그럼 내가 UINT로 내 숯불로 변환하지만 난 그것을 작동시키지 못할, 그냥 메시지 상자를 보여주지 않습니다. :-)

char str[] ="Testing message|Title Message|MB_OK|MB_ICONINFORMATION"; 
char * pch; 
char * a[4]; 
int i = 0; 
pch = strtok (str,"|"); 
while (pch != NULL) 
{ 
    a[i] = pch; 
    pch = strtok (NULL, "|"); 
    //cout << a[i]; 
    i++; 
} 
char test[1000] = ""; 
strcat_s (test,a[2]); 
strcat_s (test,"|"); 
strcat_s (test,a[3]); 

UINT y; 
stringstream s; 
s << test; 
s >> y; 


MessageBox(0,a[0],a[1],y); 
Sleep(10000); 

해결을 돕는 감사 :

     UINT x; 
          if(!strcmp(a[3],"MB_ICONERROR")){ 
           x = 0x10; 
          }else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){ 
           x = 0x30; 
          }else if(!strcmp(a[3],"MB_ICONINFORMATION")){ 
           x = 0x40; 
          }else if(!strcmp(a[3],"MB_ICONQUESTION")){ 
           x = 0x20; 
          } 
          if(!strcmp(a[2],"MB_OK")){ 
           x = x + 0; 
          }else if(!strcmp(a[2],"MB_OKCANCEL")){ 
           x = x + 1; 
          }else if(!strcmp(a[2],"MB_YESNO")){ 
           x = x + 4; 
          }else if(!strcmp(a[2],"MB_YESNOCANCEL")){ 
           x = x + 3; 
          }else if(!strcmp(a[2],"MB_RETRYCANCEL")){ 
           x = x + 5; 
          }else if(!strcmp(a[2],"MB_ABORTRETRYIGNORE")){ 
           x = x + 2; 
          } 
          MessageBox(0, a[0], a[1], x); 
+0

이 죄송합니다, 끔찍한 C++ 코드입니다. 레거시 C 함수가 아닌 적절한 C++ 기능을 사용하십시오. –

+0

나는 당신이 어떻게 제대로하는지보고 싶다. 나는 C++을 처음 사용한다. – yves

+0

주로 char const * 대신에'std :: string'을 사용한다. (특히 고정 버퍼!),'strcmp'를 사용할 필요가 없다. (대신' 'strtok' 대신에'std :: find'와 유사한 알고리즘을 사용하십시오. (strtok =='') 또는'strcat' (오버 플로우하는 경향이 있고'+'또는'+ ='를 사용하십시오. –

답변

0
MB_OK|MB_ICONINFORMATION 

사람들은 '열거'이 아니라 실제 문자열입니다. 프로그램 (문자열 외부)에서 숫자로 바뀝니다. 시스템에서 열거 형을 더 이상 인식하지 못하기 때문에 일반 문자열을 숫자로 변환하려고합니다. 분명히 예상 결과가 나오지 않습니다.

어떤 종류의 마스크를 사용하거나 문자열에 '일반'값을 입력하는 것이 좋습니다. 예를 들어 0x38입니다. here입니다.

char str[] ="Testing message|Title Message|0x40"; 

을 그리고 마지막 요소는 정수로 취급되어 있는지 확인하십시오, 그리고 '문자열'로 :

그래서,이 같은 문자열을 사용하려고합니다. this page MB_OK 및 MB_ICONINFORMATION에 따르면

+0

감사합니다,이 잘 작동하고 있습니다 :) – yves

+0

다행, 그게 내가 당신을 도울 수 있었다 :) – ATaylor

0

당신이 그런 짓을했다, 그래서 만약 # 정의입니다 :

y = MB_OK | MB_ICONINFORMATION; 

당신이 y를 변수에 원하는 값을 얻을 것입니다.

그러나 이름이이고 문자열에 #define이 있습니다. stringstream이나 내가 생각할 수있는 다른 간단한 것들도 필요한 숫자로 변환하지 않습니다.

UPDATE :

당신은 추가 다음과 같은 경우 솔루션과 질문/다른 사다리 : 당신이 그것을 할 거라면

UINT x; 
if(!strcmp(a[3],"MB_ICONERROR")){ 
    x = 0x10; 
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){ 
    x = 0x30; 
... 

, 다음 # 정의 리터럴 상수를 교체 그리고 그것은 더 깨끗해야하고 그것은 가능성이 시대에 뒤진이나 오류가되지 않습니다. (나는 창문이 상수로 아마 자주 변경하지 않는 것이 실현하지만, 이런 식으로 더 좋습니다.)

이 같을 것이다 :

UINT x; 
if(!strcmp(a[3],"MB_ICONERROR")){ 
    x = MB_ICONERROR; 
} else if(!strcmp(a[3],"MB_ICONEXCLAMATION")){ 
    x = MB_ICONEXCLAMATION; 
... 
+0

어쨌든, 그냥 간단한 간단한 방법.컴파일러가 if/else 래더에서 변환을 수행하는 방식을 반영하여 내 대답을 업데이트하여 최소한 코드에 맨수가 없도록합니다. – cds