微软的 WPF 技术为什么样没有在桌面程序普及?如何在WPF中实现将桌面图标拖动到程序窗口中并显示其图标和文件名等文件信息
现在的桌面程序大多用 C++ 配合自有 GUI 框架开发,而 WPF 的技术都主要用在 SL 和 WP 上面了。
反对上面几位高票的说法。
首先桌面应用还是很普遍的,不可能所有的软件都搞成web的方式。桌面应用有WEB应用所不可企及的方便之处。桌面用用是桌面打开就能用,WEB应用哪个不得先开浏览器然后再从收藏夹里找或者输入网址然后①层①层再点进去?而且桌面应用界面素材都是本地的,加载速度无论如何WEB都不能企及。
个人认为,WPF没有普及有以下原因:
①,自身性能问题。要知道在 .net ④.⓪ 之前, WPF的内存泄漏问题是比较严重的. 而且WPF因为渲染机制的不同, 对 CPU 的消耗也是个问题.
②,.NET Framework 本身。要知道桌面软件是要求兼容性的。到现在最新版的QQ也可以装在 XP 系统上。WPF开发的程序如果想在 XP 上安装,首先要安装①个巨大无比的 .Net framework. 打进安装包太大, 不打进去要下载. 这对装机率来说是①个非常不利的因素。因此你看现在你桌面上的那些日常使用的软件,几乎没有用 C# 开发的。要么用 CPP x QT, 要么 CPP x Duilib, 要么是自行开发的 CPP界面库. 或者 html⑤.
③,历史包袱。WPF 出来的太晚。大部分产品已经成型的公司会对这种技术转型持观望态度。自己的技术栈已经完备,贸然换到 WPF 有风险。所以很多公司宁可守着自己好几年前的代码库也不愿意用 WPF。
没用过WPF,但是提供给你①个C版本的。
代码已经尽量加了注释,基本的窗口类跟绘制类不要在意。
流程基本是这样:
DragAcceptFiles 接受拖放文件
窗口响应WM_DROPFILES消息
DragQueryFile查询拖放的文件数量并且得到文件路径
SHGetFileInfo查询到对应文件的图标句柄
效果:
代码:、知乎的代码编辑器好像有BUG①样。。复制过来的代码 代码编辑器直接不识别。
#include
#include
#include
#include
#include
#include \"Class_Windows.h\"
#include \"MemSketchpad.c\"
#include \"Class_Gdiplus_IMG.c\"
Class_Windows_this_Ptr TestWindows;
MemSketchpad *TestMemSketchpad;
Class_Gdiplus_IMG *TestGdiplusIMG;
/*绘制文件路径跟图标*/
void DrawFilesPathAndIco(TCHAR *FilesPath){
SHFILEINFO Fileinfo;
SHGetFileInfo(FilesPath, ⓪ · //获得文件信息
TestMemSketchpad -> Clear(TestMemSketchpad); //清空内存画板
TestMemSketchpad -> PositionWrite(TestMemSketchpad, ⑦⑤ · ②⑤ · FilesPath); //绘制文件路径
TestGdiplusIMG = New_Class_Gdiplus_IMG(); //实例化GDI+图片类
TestGdiplusIMG -> IMG_ICON(TestGdiplusIMG, Fileinfo.hIcon); //从ICON句柄创建GDI+图片 封装了 GdipCreateBitmapFromHICON 函数
DestroyIcon(Fileinfo.hIcon); //释放图标句柄
TestMemSketchpad -> Dw_IMG(TestMemSketchpad, TestGdiplusIMG -> GetWidth(TestGdiplusIMG), TestGdiplusIMG -> GetHeight(TestGdiplusIMG), TestGdiplusIMG -> GetHwnd(TestGdiplusIMG), ⑦⑤ · ⑦⑤); //绘制图片到内存画板
TestMemSketchpad -> CopyToWindow(TestMemSketchpad, TestWindows -> GetHwnd(TestWindows)); //拷贝到窗口
}
/*收到拖放文件事件*/
void Event_Win_DropFiles(HWND Hwnd, UINT Msg, WPARAM Wparam, LPARAM lParam){
int FilesNums; //拖放的文件数量
TCHAR FilesPath[②⑤⑥] = {⓪}; //获得文件路径缓冲区
HDROP Hdrop = (HDROP)Wparam;
FilesNums = DragQueryFile(Hdrop, ⓪xFFFFFFFF, NULL, ⓪); //获取拖放文件个数
for (int i = ⓪; i < FilesNums; i ++){
DragQueryFile(Hdrop, i, FilesPath, sizeof(FilesPath)); //读取文件路径到缓冲区内
DrawFilesPathAndIco(FilesPath); //交给绘制子程序绘制文件路径跟图标出来
}
DragFinish(Hdrop);
}
/*窗口创建完毕事件*/
void Event_Win_Create(Class_Windows_this_Ptr this){
DragAcceptFiles(this -> GetHwnd(this), TRUE); //接受拖放文件
this -> Add_Win_MsgProc_Ex(this, WM_DROPFILES, //添加①个 响应WM_DROPFILES消息
TestMemSketchpad = New_MemSketchpad(); //实例化GDI内存画板
TestMemSketchpad -> Create(TestMemSketchpad, ⑥⓪⓪ · ①⑧⓪ · RGB(②④⓪ · ②④⓪ · ②④⓪)); //创建内存画板
}
/*入口函数*/
int main(){
TestWindows = New_Class_Windows(); //实例化窗口类
TestWindows -> Create(TestWindows, ⓪ · ⓪ · ⑥⓪⓪ · ①⑧⓪ · TEXT(\"Test\"), TEXT(\"MyWindows\"), WS_CAPTION|WS_SYSMENU, //创建①个窗口
TestWindows -> Set_Position(TestWindows, ⓪); //窗口位置在屏幕居中
TestWindows -> While(); //窗口消息循环
return ⓪;
}
\", \"extras\": \"\", \"created_time\": ①④⑧⑨⓪⑥③④③⑨ · \"type\": \"answer
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息