2013-10-09 26 views
0

我正在創建一個win32應用程序並在我的WM_CREATE開關櫃中初始化了我的狀態欄寬度變量。從不同開關櫃的C++訪問變量

case WM_CREATE: 
    { 
    int statwidths[] = { 200, -1 }; 
    } 
    break; 

我想訪問statwidths [0]在我WM_SIZE開關情況下,該數字將被用於確定在我的程序的我的窗口的其餘部分的大小。

case WM_SIZE: 
    { 
    int OpenDocumentWidth = statwidths[ 0 ]; 
    } 
    break; 

有沒有辦法做到這一點?它們在同一個文件中都在同一個switch語句中。

+0

不,您不能使用完全不同範圍的變量。你必須將其移出。 – chris

+0

......並且這可能會對你沒什麼好處(除了允許它編譯),除非你也使它成爲'static'。它的值不會在Windows消息之間保留,除非您將它放在持久存儲在WndProc中的存儲中。 – WhozCraig

+0

這就是我的想法,但我不確定。我試着搜索了大約一個小時,然後在這裏嘗試了一下。看看是否有一些我不知道的後臺功能。它會讓我的程序變得更容易哈哈。 – Vince

回答

0

如果這些都在同一個switch語句中,那麼絕對不是。考慮

switch (n) { 
    case 1: { 
    } 
    case 2: { 
    } 
} 

的情況下1範圍內會發生什麼,當n爲1。如果我們沒有聲明一個變量,然後我們把這個代碼,其中n = 2只發生,變量沒有聲明。

int n; 
if(fileExists("foo.txt")) 
    n = 2; 
else 
    n = 1; 
switch (n) { 
    case 1: { 
     ostream outfile("foo.txt"); 
     ... 
     break; 
    } 
    case 2: { 
     // if outfile were to be initialized as above here 
     // it would be bad. 
    } 
} 

可以聲明開關以外的變量,但你不應該再假設前面的情況已經做了的事情,除非開關是循環中。

當時,我上次嘗試在kindle上做這個。

0

你需要爲你的窗口類處理它應該是這樣的:

class Foo 
{ 
private: 
    int* statwidths; 
    HWND hwnd; 

public: 
    Foo(){}; 
    ~Foo(){}; 

    bool CreateWindow() 
    { 
    //some stuff 
    hwnd = CreateWindowEx(...); 
    SetWindowLongPtr(hwnd GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); 
    //some stuff 
    } 

    static LRESULT callback(HWND hwnd, ...) 
    { 
    Foo* classInfo = reinterpret_cast<Foo *>(GetWindowLongPtr(window, GWLP_USERDATA)); 
    case WM_CREATE: 
    { 
     classInfo->statwidths = new int[2]; 
     classInfo->statwidths[0] = 200; 
     classInfo->statwidths[1] = -1; 
     break; 
    } 

    case WM_SIZE: 
    { 
     int OpenDocumentWidth = classInfo->statwidths[0]; 
    } 

    case WM_CLOSE: 
    { 
     delete [] classInfo->statwidths; 
    } 
    } 
}; 

這僅僅是一小片的需要編寫代碼,但你可以使用它作爲一個基礎的你,希望有所幫助。