سؤال

وفي Visual Studio أنا ولدت تطبيق Win32 سهل القديمة وجرد جميع الموارد وإنشاء التعليمات البرمجية بحيث يتكون طلبي هذا:

#include "stdafx.h"
#include "IcoTest.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
    ::MessageBox( NULL, L"Testing", L"Test", MB_OK );
}

وعند تشغيل التطبيق، وهذا هو ما أراه:

وهكذا فإن السؤال هو يمكنني تغيير ذلك الرمز التطبيق الافتراضي في شريط المهام؟ إذا كان الأمر كذلك، ما كود يحتاج إلى إضافته للقيام بذلك؟

وتحرير:

وإليك ما فعلت، وهذا النوع من الأعمال لكنها ليست مثالية. يظهر رمز جديد يصل ما يرام، ولكن لا يعمل نافذة المعاينة شريط المهام في ويندوز فيستا ونظام القائمة لا تعمل لذلك أنا ذاهب لمجرد تترك وحدها في الوقت الراهن.

HWND CreateDummyWindow(HINSTANCE hInstance, int iconId, LPCTSTR taskbarTitle)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = DefWindowProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(iconId));
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = 0;
wcex.lpszMenuName   = 0;
wcex.lpszClassName  = taskbarTitle,
wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(iconId));
ATOM atom = RegisterClassEx(&wcex);
HWND wnd = ::CreateWindow( 
    wcex.lpszClassName, taskbarTitle, WS_ICONIC | WS_DISABLED,
  -1000, -1000, 1, 1, NULL, NULL, hInstance, NULL);
return wnd;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                 HINSTANCE hPrevInstance,
                 LPTSTR    lpCmdLine,
                 int       nCmdShow)
{
    HWND wnd = CreateDummyWindow(hInstance, IDI_ICON1, _T("Test") );
    ::MessageBox( wnd, _T("Testing"), _T("Test"), MB_OK );
    ::DestroyWindow( wnd );
}
هل كانت مفيدة؟

المحلول

ويتم أخذ رمز يظهر على شريط المهام من النافذة نفسها. إذا كان الإطار الوحيد هو المعيار ويندوز MesssageBox، ثم عليك الحصول على نوع من نظام التشغيل الافتراضي. لديك لإنشاء نافذة الخاص واعطائها رمز، ثم سيقوم Windows استخدام ذلك.

نصائح أخرى

وهذا يبدو وكأنه نموذج التعليمات البرمجية فقط. إذا كان رمز الحقيقي هو غير وحدة التحكم تطبيق ويندوز، يمكنك القيام بذلك:

وتعطي الإطار الرئيسي التطبيق الخاص بك رمز شريط المهام عن طريق الاتصال <لأ href = "http://msdn.microsoft.com/en-us/library/9cb3b7b5(VS.80).aspx" يختلط = "نوفولو noreferrer" > SetIcon () . ثم عند استدعاء MESSAGEBOX ()، تعيين المعلمة الأولى إلى HWND من الإطار الرئيسي التطبيق الخاص بك.

لهذه الحالة بالذات (دعوة MessageBox واحدة في وظيفة WinMain) هل يمكن ربط خلق الحوار مربع الرسالة ووضع رمز هناك. مثل هذا:

HHOOK g_hMsgBoxHook;
HINSTANCE g_hInstance;

LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode == HC_ACTION)
    {
        CWPSTRUCT* pcwp = (CWPSTRUCT*)lParam;

        if(pcwp->message == WM_INITDIALOG)
        {
            HICON hIcon = NULL;
            HICON hIconBig = NULL;

            // Small icon.
            hIcon = (HICON)LoadImage(g_hInstance,
                           MAKEINTRESOURCE(IDI_MYICON),
                           IMAGE_ICON,
                           GetSystemMetrics(SM_CXSMICON),
                           GetSystemMetrics(SM_CYSMICON),
                           0);
            if(hIcon)
            {
                SendMessage(pcwp->hwnd, WM_SETICON,
                    ICON_SMALL, (LPARAM)hIcon);
            }

            // Big icon.
            hIconBig = (HICON)LoadImage(g_hInstance,
                           MAKEINTRESOURCE(IDI_MYICON),
                           IMAGE_ICON,
                           GetSystemMetrics(SM_CXICON),
                           GetSystemMetrics(SM_CXICON),
                           0);
            if(hIconBig)
            {
                SendMessage(pcwp->hwnd, WM_SETICON,
                    ICON_BIG, (LPARAM)hIconBig);
            }
        }
    }

    return CallNextHookEx(g_hMsgBoxHook, nCode, wParam, lParam); 
}

int CALLBACK wWinMain(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPWSTR lpCmdLine,
  int nCmdShow
)
{
    g_hInstance = hInstance;
    g_hMsgBoxHook = SetWindowsHookEx(WH_CALLWNDPROC,
        CallWndProc, NULL, GetCurrentThreadId());

    MessageBoxW(NULL, L"Testing", L"Test", MB_OK);

    // ...

    UnhookWindowsHookEx(g_hMsgBoxHook);
}

وأين IDI_MYICON هو معرف الموارد الرمز الخاص بك.

WNDCLASSEX wndclass;

wndclass.cbSize        = sizeof(wndclass);
// ..
wndclass.hIconSm       = ExtractIconEx( ... );
RegisterClassEx(&wndclass);

HWDN wnd = CreateWindow(...)

لماذا لا مجرد إضافة موارد رمز إلى EXE؟ أنا متأكد من ويندوز محاولة ذلك قبل أن يتراجع إلى الرموز "عامة".

وإنشاء نموذج ولكن لم تظهر عليه ثم عين له رمز واستخدام ذلك الأصل مربع الرسالة.

وهذا يخفي رمز:

using (var f = new Form())
{
    MessageBox.Show(f,"my message");
}

وهذا سيخلق رمز:

using (var f = new Form())
{
    f.Icon = Resources.IconUpload;
    f.Location=new Point(-1000,-1000);
    f.StartPosition = FormStartPosition.Manual;
    f.Show();
    MessageBox.Show(f,"my message");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top