2011-08-23 14 views
5

मैं विंडोज 7 में विजुअल स्टूडियो 2008 का उपयोग कर एमएफसी में एक एप्लीकेशन बना रहा हूं। मेरा एप्लिकेशन शुरू होता है और एक सेवा बंद करता है जिसके लिए प्रशासनिक पहुंच की आवश्यकता होती है। जब एप्लिकेशन शुरू होता है तो उसके पास प्रशासनिक पहुंच नहीं होती है। लेकिन जब मैं स्टार्ट सर्विस बटन पर क्लिक करता हूं तो इसे प्रशासनिक पहुंच मिलती है और कार्रवाई करता है। मैं सोच रहा हूं कि उन बटनों पर व्यवस्थापकीय आइकन कैसे सेट करें जिनके कार्यों को व्यवस्थापकीय पहुंच की आवश्यकता है? क्या मुझे किसी प्रकार के झंडे सेट करने की ज़रूरत है? धन्यवादएमएफसी संवाद बटन पर व्यवस्थापकीय दाएं आइकन कैसे सेट करें?

उत्तर

6

विंडोज विस्टा के रूप में आप नए झंडे में से एक का उपयोग कर एक बटन पर शील्ड आइकन जोड़ सकते हैं। वहाँ, यह सक्षम करने के लिए आप इस तरह उपयोग कर सकते हैं जो एक मैक्रो है: मैक्रो के लिए

Button_SetElevationRequiredState(hwnd, TRUE); 

प्रलेखन http://msdn.microsoft.com/en-us/library/bb761865%28VS.85%29.aspx

पर कितने यूएसी संबंधित कार्य करने के लिए के एक सिंहावलोकन के लिए http://msdn.microsoft.com/en-us/library/bb756990.aspx#BKMK_ShieldButton देखें है।

सीबीटटन :: SetElevationRequired() भी है जो संभावित रूप से वही काम करता है लेकिन आपके एमएफसी प्रोजेक्ट के अनुरूप अधिक फिट बैठता है। आप इसे इस तरह इस्तेमाल कर सकते हैं:

ctl->SetElevationRequired(TRUE); 

http://msdn.microsoft.com/en-us/library/bb386824%28v=VS.90%29.aspx

देखें आपको उन सामान्य नियंत्रण v6 DLL, जो आप करते हैं या तो एक मैनिफ़ेस्ट फ़ाइल (उपयोग करने के साथ या में एक प्रविष्टि witout कर सकते हैं के उपयोग को सक्षम करना होगा आपकी संसाधन फ़ाइल इसे एम्बेड करने के लिए) या MSVC2005 या बाद में आपके कोड में #pragma निर्देश का उपयोग कर। संभावनाएं एक एमएफसी एप्लिकेशन के साथ हैं कि आपके पास पहले से ही एक मैनिफेस्ट होगा जिसे आप संशोधित कर सकते हैं, लेकिन मैं आपकी मदद नहीं कर सकता क्योंकि मेरे पास एमएफसी तक पहुंच नहीं है।

यदि आप मैनिफेस्ट रूट पर जाते हैं तो इसे इस तरह कुछ दिखाना चाहिए और आपके एप्लिकेशन के समान नाम होना चाहिए, लेकिन .exe के बाद ".manifest" के साथ। MyApp.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity 
    version="1.0.0.0" 
    processorArchitecture="*" 
    name="CompanyName.ProductName.YourApplication" 
    type="win32" 
/> 
<description>Your application description here.</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="*" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
</assembly> 

#pragma के लिए, नीचे दिए गए कोड को देखें।

v6 का उपयोग करके सामान्य नियंत्रण इस लिंक को देख (जो मैं कहाँ से उपरोक्त जानकारी मिल गया) के बारे में अधिक जानकारी के लिए: http://msdn.microsoft.com/en-us/library/bb773175%28v=vs.85%29.aspx

एक छोटा सा Win32 उदाहरण जो आम नियंत्रण v6 सक्षम करने के लिए pragma directive का उपयोग करता है और ऊंचाई को प्रदर्शित करता है आइकन:

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 

#pragma comment(linker,"\"/manifestdependency:type='win32' \ 
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ 
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); 

int WINAPI WinMain (HINSTANCE instance, 
        HINSTANCE previnst, 
        LPSTR args, 
        int wndState) 
{ 
    int i; 
    MSG messages; 
    WNDCLASSEX wincl; 
    ZeroMemory(&wincl, sizeof(wincl)); 
    wincl.hInstance = instance; 
    wincl.lpszClassName = L"WindowsApp"; 
    wincl.lpfnWndProc = WindowProcedure; 
    wincl.style = CS_DBLCLKS; 
    wincl.cbSize = sizeof wincl; 
    wincl.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); 

    InitCommonControls(); 

    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW); 

    if (!RegisterClassEx (&wincl)) 
     return 0; 

    HWND hwnd = CreateWindow(L"WindowsApp", L"Windows App", WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, instance, NULL); 

    HWND hButton = CreateWindow(L"BUTTON", L"Do something", WS_TABSTOP | WS_VISIBLE | WS_CHILD, 10, 10, 200, 23, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); 

    SendMessage(hButton, WM_SETFONT, (LPARAM) GetStockObject(DEFAULT_GUI_FONT), FALSE); 
    Button_SetElevationRequiredState(hButton, TRUE); 

    ShowWindow(hwnd, wndState); 

    while (GetMessage(&messages, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&messages); 
     DispatchMessage(&messages); 
    } 
    return messages.wParam; 
} 

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 

     default: 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 

    return 0; 
} 
+0

मैंने कोशिश की लेकिन यह बटन पर शील्ड आइकन नहीं दिखाया। क्या आप मुझे नमूना कोड टेम्पलेट प्रदान कर सकते हैं? धन्यवाद –

+0

@ अली अहमद: मैंने एक उदाहरण और अधिक स्पष्टीकरण जोड़ा है। – tinman