簡體   English   中英

C ++函數回調

[英]C++ function callback

這是我在這篇文章中繼續關注的話題: 如何獲得每個顯示器的尺寸(分辨率)?

我想將解決方案包含在一個類中。 但是在編譯時會保留此錯誤:

錯誤C2065:“ MonitorEnumProc”:未聲明的標識符。

ScreenManager::ScreenManager() {
     BOOL monitorInitialized = EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(this) );
}

BOOL CALLBACK MonitorEnumProc(  HMONITOR hMonitor,
                                HDC hdcMonitor,
                                LPRECT lprcMonitor,
                                LPARAM dwData ) {

    reinterpret_cast<ScreenManager*>(dwData)->callback(hMonitor,hdcMonitor,lprcMonitor);
    return true;
}

bool ScreenManager::callback(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor) {

    screenCounter++;

    MONITORINFO  info;
    info.cbSize =  sizeof(MONITORINFO);

    BOOL monitorInfo = GetMonitorInfo(hMonitor,&info);

    if( monitorInfo ) {
        std::vector<int> currentScreenVector;
        currentScreenVector.push_back( screenCounter );
        currentScreenVector.push_back( abs(info.rcMonitor.left - info.rcMonitor.right) );
        currentScreenVector.push_back( abs(info.rcMonitor.top - info.rcMonitor.bottom) );
        screenVector.push_back( currentScreenVector );
    }

    return true;
}

提前致謝!

在您調用EnumDisplayMonitors ,編譯器不知道MonitorEnumProc存在。 您有兩種選擇:

更改這兩個函數的順序,因此MonitorEnumProc首先出現:

BOOL CALLBACK MonitorEnumProc(  HMONITOR hMonitor,
                                HDC hdcMonitor,
                                LPRECT lprcMonitor,
                                LPARAM dwData ) {

    reinterpret_cast<ScreenManager*>(dwData)->callback(hMonitor,hdcMonitor,lprcMonitor);
    return true;
}

ScreenManager::ScreenManager() {
     BOOL monitorInitialized = EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(this) );
}

要么,

在嘗試引用MonitorEnumProc之前,添加一個前向聲明:

BOOL CALLBACK MonitorEnumProc(  HMONITOR hMonitor,
                                HDC hdcMonitor,
                                LPRECT lprcMonitor,
                                LPARAM dwData );

ScreenManager::ScreenManager() {
     BOOL monitorInitialized = EnumDisplayMonitors( NULL, NULL, MonitorEnumProc, reinterpret_cast<LPARAM>(this) );
}

BOOL CALLBACK MonitorEnumProc(  HMONITOR hMonitor,
                                HDC hdcMonitor,
                                LPRECT lprcMonitor,
                                LPARAM dwData ) {

    reinterpret_cast<ScreenManager*>(dwData)->callback(hMonitor,hdcMonitor,lprcMonitor);
    return true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM