关于托盘中气球提示的实现中遇到的问题,显示不出来气球。。。。

yiruirui0507 2011-03-06 04:48:57
RT:
由于VC 6中的shellapi.h中的NOTIFYICONDATA结构体定义的变量比较少,不支持托盘气球,因此改用了VS08进行的编译。

程序可以正常编译运行,就是没出现气球提示,先贴出一下全部代码吧,方便大家交流。
#include<windows.h>
#include<tchar.h>
#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDM_RESTORE 100
#define IDM_EXIT 101
//#define _WIN32_IE 0x0600
TCHAR ClassName[]=_T("TrayIconWinClass");
TCHAR AppName[]=_T("TrayIcon Demo");
TCHAR RestoreString[]=_T("&Restore");
TCHAR ExitString[]=_T("&Exit Program");
HINSTANCE g_hInstance;
NOTIFYICONDATA note;
HMENU hPopupMenu;
INT_PTR CALLBACK ProcWinMain(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
POINT pt;
switch(Msg)
{
case WM_CREATE:
hPopupMenu=CreatePopupMenu();
AppendMenu(hPopupMenu,MF_STRING,IDM_RESTORE,RestoreString);
AppendMenu(hPopupMenu,MF_STRING,IDM_EXIT,ExitString);
//note.cbSize=sizeof(NOTIFYICONDATA);
//note.uFlags=NIM_ICON|NIM_
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);

}
}
break;
case WM_COMMAND:
if(lParam==0)
{
Shell_NotifyIcon(NIM_DELETE,¬e);
if(LOWORD(wParam)==IDM_RESTORE)
{
ShowWindow(hWnd,SW_RESTORE);

}
else
DestroyWindow(hWnd);
}
break;
case WM_SHELLNOTIFY:
if(wParam==IDI_TRAY)
{
if(lParam==WM_RBUTTONDOWN)
{
GetCursorPos(&pt);
TrackPopupMenu(hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL);
}
else if(lParam==WM_LBUTTONDBLCLK)
{
SendMessage(hWnd,WM_COMMAND,IDM_RESTORE,0);
}

}
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
g_hInstance = hInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)ProcWinMain;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
RegisterClassEx(&wc);

hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,ClassName,AppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


return msg.wParam;
}


其中托盘气球的那部分代码:
///////////////////////////////////////////////////////////////////////////////////////////////////////
case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;//NIF_INFO必须包含
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);

}
}
break;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////想实现当窗口最小化的时候出现气球提示.
NIF_INFO使得4个成员变量有效,MSDN中如是说。
请大家帮忙看看是不是哪里还有问题,先说3Q!
...全文
341 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
无水先生 2011-03-08
  • 打赏
  • 举报
回复
我在VC8的可以,不过最小后就不能变大了,全部代码如下:

// Boolen.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "Boolen.h"

#include<windows.h>
#include<tchar.h>
#include<shellapi.h>

#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDM_RESTORE 100

//#define _WIN32_IE 0x0600
TCHAR ClassName[]=_T("TrayIconWinClass");
TCHAR AppName[]=_T("TrayIcon Demo");
TCHAR RestoreString[]=_T("&Restore");
TCHAR ExitString[]=_T("&Exit Program");

HINSTANCE g_hInstance;
NOTIFYICONDATA note;
HMENU hPopupMenu;

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_BOOLEN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_BOOLEN));

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BOOLEN));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_BOOLEN);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
//DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;

case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO|NIF_TIP;
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);

}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。

yiruirui0507 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cranium 的回复:]
引用 7 楼 mz_dong 的回复:

To remove the balloon notification from the UI, either delete the icon (with NIM_DELETE) or set the NIF_INFO flag in uFlags and set szInfo to an empty string.


note.hIcon=Lo……
[/Quote]
哦,你看错了吧,这段话的意思是如何移掉气球通知,2个办法,用NIM_DELETE或者设置NIF_INFO标志,并且设置szInfo为空字符串,
没有说为何 我设置的是IDI_HAND,托盘中却显示的是IDI_ERROR
cranium 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mz_dong 的回复:]

To remove the balloon notification from the UI, either delete the icon (with NIM_DELETE) or set the NIF_INFO flag in uFlags and set szInfo to an empty string.


note.hIcon=LoadIcon(NULL,IDI_XXX);
……
[/Quote]

我觉着mz_dong兄的帖子已经回答你的问题了。
yiruirui0507 2011-03-07
  • 打赏
  • 举报
回复
好吧,看看这个IDI_HAND为何显示的是IDI_ERROR有人知道吗,没就结贴吧。
mz_dong 2011-03-07
  • 打赏
  • 举报
回复
To remove the balloon notification from the UI, either delete the icon (with NIM_DELETE) or set the NIF_INFO flag in uFlags and set szInfo to an empty string.


note.hIcon=LoadIcon(NULL,IDI_XXX);
Shell_NotifyIcon(NIM_MODIFY,¬e);
cranium 2011-03-07
  • 打赏
  • 举报
回复
没试过去该显示时间,感觉这个是系统支持的,3秒也太短了,根本没时间看明白。

MSDN里有篇讲解NOTIFYICON的文章,标题是:Notifications and the Notification Area
作者虽是在Win7下说的,但是还是对比着XP来说,区别也讨论了很多,感觉不错。

里面提到了一点,后来很久我才意识到其意义。说的是WIN7下通过GUID来表示一个trayicon,而XP是通过窗口句柄和一个APP defined值共同来确定一个trayicon。 使用意义在于如果是XP系统,访问一个trayicon时需要同时指定NOTIFYICONDATA里的句柄成员和id成员(id通常是icon的资源ID),有这2个东西就可以唯一标识一个trayicon。

另外从NOTIFYICONDATA的使用来看,我觉得在第一次ADD进去后,系统就保持了该icon的信息,这个结构就不再需要了(所以通常都定义为一个局部变量)。以后如果要访问某个trayicon,只需要指定hwnd,id就可以,在填入需要的Flag实现特定提示就差不多了。
yiruirui0507 2011-03-06
  • 打赏
  • 举报
回复
感谢楼上两位的回答,经测试是正确的。
关于这个系统托盘气球还有2个小问题,麻烦一下:
1 note.uTimeout=3000;MSDN上说最小时间是10,最大是30,小于最小的话,默认是10,大于30的话,默认是30,问题,能不能改掉这个时间,我就想让显示3秒行吗?
2 想趁机测试一下修改托盘图标,结果又发现了问题,图标我明明定义的是IDI_HAND,结果显示的确实IDI_ERROR,很是奇怪。麻烦大家看看为什么这样。。。

还是那样给出代码方便交流,
#define _WIN32_WINNT 0x0500

#include<windows.h>
#include<tchar.h>
#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDI_TEST 1
#define IDM_RESTORE 100
#define IDM_EXIT 101
//#define _WIN32_IE 0x0600

TCHAR ClassName[]=_T("TrayIconWinClass");
TCHAR AppName[]=_T("TrayIcon Demo");
TCHAR RestoreString[]=_T("&Restore");
TCHAR ExitString[]=_T("&Exit Program");
TCHAR AppName1[]=_T("remind");
HINSTANCE g_hInstance;
NOTIFYICONDATA note;
HMENU hPopupMenu;
INT_PTR CALLBACK ProcWinMain(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
POINT pt;
switch(Msg)
{
case WM_CREATE:
hPopupMenu=CreatePopupMenu();
AppendMenu(hPopupMenu,MF_STRING,IDM_RESTORE,RestoreString);
AppendMenu(hPopupMenu,MF_STRING,IDM_EXIT,ExitString);
//note.cbSize=sizeof(NOTIFYICONDATA);
//note.uFlags=NIM_ICON|NIM_
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
{
if(wParam==SIZE_MINIMIZED)
{
Shell_NotifyIcon(NIM_DELETE,¬e);
note.cbSize=sizeof(NOTIFYICONDATA);
note.hWnd=hWnd;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO;//|NIF_TIP;
note.uID=IDI_TRAY;
note.uCallbackMessage=WM_SHELLNOTIFY;
//lstrcpy(note.szTip,AppName);
note.dwInfoFlags=NIIF_INFO;
note.uTimeout=3000;
lstrcpy(note.szInfo,AppName);
lstrcpy(note.szInfoTitle,AppName);
note.hIcon=LoadIcon(NULL,IDI_WINLOGO);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);


}
//当恢复显示的时候我想把托盘图标改为IDI_HAND手型LoadIcon(NULL,IDI_HAND);
if(wParam==SIZE_RESTORED)
{
note.cbSize=sizeof(note);
note.hWnd=hWnd;
//note.uID=IDI_TEST;//这里也有点迷茫,如果不注释掉这句图标就改变不了
note.uCallbackMessage=WM_SHELLNOTIFY;
note.uFlags=NIF_ICON|NIF_MESSAGE|NIF_INFO;//|NIF_TIP;
note.hIcon=LoadIcon(NULL,IDI_HAND);
lstrcpy(note.szInfoTitle,AppName1);
lstrcpy(note.szInfo,AppName1);
note.uTimeout=3000;
note.uVersion=NOTIFYICON_VERSION;
Shell_NotifyIcon(NIM_MODIFY,¬e);
}
}
break;
case WM_COMMAND:
if(lParam==0)
{
//由于要修改托盘图标,所以恢复的时候托盘中的图标还必须存在
Shell_NotifyIcon(NIM_DELETE,¬e);
Shell_NotifyIcon(NIM_ADD,¬e);
if(LOWORD(wParam)==IDM_RESTORE)
{
ShowWindow(hWnd,SW_RESTORE);

}
else
DestroyWindow(hWnd);
}
break;
case WM_SHELLNOTIFY:
if(wParam==IDI_TRAY||wParam==IDI_TEST)
{
if(lParam==WM_RBUTTONDOWN)
{
GetCursorPos(&pt);
TrackPopupMenu(hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL);
}
else if(lParam==WM_LBUTTONDBLCLK)
{
SendMessage(hWnd,WM_COMMAND,IDM_RESTORE,0);
}

}
//if(wParam==IDI_TEST)
//MessageBox(hWnd,AppName,AppName,MB_OK);
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
g_hInstance = hInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC)ProcWinMain;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
RegisterClassEx(&wc);

hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,ClassName,AppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}


return msg.wParam;
}

cranium 2011-03-06
  • 打赏
  • 举报
回复
如果mz_dong兄在WIN7测试成功的话,那就应该是系统版本支持问题,修改_WIN32_WINNT定义如下

//XP 0x0501
#define _WIN32_WINNT 0x0501

mz_dong 2011-03-06
  • 打赏
  • 举报
回复
note.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION));
win7测试成功,应该是版本问题


Several members of this structure are only supported for Windows 2000 and later. To enable these members, include one of the following lines in your header:

Windows Vista and later:
#define NTDDI_VERSION NTDDI_WIN2K
#define NTDDI_VERSION NTDDI_WINXP
#define NTDDI_VERSION NTDDI_VISTA

Windows XP and earlier:
#define _WIN32_IE 0x0500
#define _WIN32_IE 0x0600



You can maintain application compatibility with all Shell32.dll versions while still using the current header files by setting the size of the NOTIFYICONDATA structure appropriately. Before you initialize the structure, use DllGetVersion to determine which Shell32.dll version is installed on the system and initialize cbSize with one of these values:

Shell32.dll Version cbSize
6.0.6 or higher (Windows Vista and later) sizeof(NOTIFYICONDATA)
6.0 (Windows XP) NOTIFYICONDATA_V3_SIZE
5.0 (Windows 2000) NOTIFYICONDATA_V2_SIZE
Versions lower than 5.0 NOTIFYICONDATA_V1_SIZE
mz_dong 2011-03-06
  • 打赏
  • 举报
回复
LZ什么系统的,XP?
yiruirui0507 2011-03-06
  • 打赏
  • 举报
回复
按照网友们对这个问题的看法,我进行了以下改变


#pragma once

// 以下宏定义要求的最低平台。要求的最低平台
// 是具有运行应用程序所需功能的 Windows、Internet Explorer 等产品的
// 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
// 正常工作。

// 如果必须要针对低于以下指定版本的平台,请修改下列定义。
// 有关不同平台对应值的最新信息,请参考 MSDN。
#ifndef WINVER // 指定要求的最低平台是 Windows Vista。
//#define WINVER 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#define WINVER 0x0501
#endif

#ifndef _WIN32_WINNT // 指定要求的最低平台是 Windows Vista。
//#define _WIN32_WINNT 0x0600 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
#define WINVER 0x0501
#endif

#ifndef _WIN32_WINDOWS // 指定要求的最低平台是 Windows 98。
#define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
#endif

#ifndef _WIN32_IE // 指定要求的最低平台是 Internet Explorer 7.0。
#define _WIN32_IE 0x0700 // 将此值更改为相应的值,以适用于 IE 的其他版本。
#endif


但是还是没有出现气球提示,所以我想是不是代码出现了什么问题?求大家赐教。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧