5080|14

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于ListView_SetItemPosition()的问题 [复制链接]

我用ListView_SetItemPosition设置My Device与Recycle Bin位置,无法改变图标位置
如果文件夹中无My Device与Recycle Bin则可以改变图标位置
我确定ListView控件没设LVS_AUTOARRANGE
这是怎么回事?有什么办法?

最新回复

在m_pShellListView->SetRedraw(TRUE);之前增加         if (m_pShellListView->IsAutoArrangeEnabled())         {             m_pShellListView->ToggleAutoArrange(FALSE);         } 还是没用。  详情 回复 发表于 2008-11-14 17:42
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没明白你的意思。改变图标位置是什么意思?
LVS_AUTOARRANGE 是自动排列吧,看不出关系
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 constantine 的回复:
没明白你的意思。改变图标位置是什么意思?
LVS_AUTOARRANGE 是自动排列吧,看不出关系


设了这个LVS_AUTOARRANGE的话ListView_SetItemPosition就无效了

我的目标是,比如我做的是smartphone,我主屏放了9个应用,放在第一的应用可能是“电话”、“设置”之类的
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
可能是LZ用的方式不对哦
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

5
 
有可能,就是不知道错在哪里:(
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 4 楼 comey 的回复:
有可能,就是不知道错在哪里:(


LS不想帖出代码,就只有自己研究了
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果文件夹中无My Device与Recycle Bin则可以改变图标位置 也就是和这两个ITEM有关,你在ADD这两的时候都做什么了,至少把这段贴上来。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
对桌面也是这样,其实没改什么,见下面红色部分为我修改的,其它的都是WinCE5.0原始代码

STDMETHODIMP CDefShellView::Refresh()
{
   HRESULT hr = NOERROR;

   if (IN_REFRESH & m_uState)
   {
      return S_FALSE;
   }

   if (IN_LABEL_APPLY & m_uState)
   {
      // RenameNamespacePidl calls refresh on all views.
      // Delay the refresh for the view on ApplyLabelEdit.
      ::PostMessage(m_hwnd, WM_COMMAND, IDC_REFRESH, NULL);
      goto leave;
   }

   m_uState |= IN_REFRESH;

   if (m_pShellListView && m_pShellListView->Clear())
   {
      SHCONTF grfFlags = SHCONTF_NONFOLDERS | SHCONTF_FOLDERS;
      if (UserSettings::GetShowHiddenFiles())
      {
         grfFlags |= SHCONTF_INCLUDEHIDDEN;
      }

      LPENUMIDLIST pEnumIDList = NULL;
      hr = m_pShellFolder->EnumObjects(m_hwnd, grfFlags, &pEnumIDList);
      if (SUCCEEDED(hr))
      {
         IEnumFilter* pIEnumFilter;
         if (m_pszFilter &&
            SUCCEEDED(pEnumIDList->QueryInterface(IID_IEnumFilter, (void**)&pIEnumFilter)))
         {
            // Note that SetFilterString() will reset EnumFilter on failure
            pIEnumFilter->SetFilterString(m_pszFilter);
            pIEnumFilter->Release();
         }

         m_pShellListView->SetRedraw(FALSE);
         if (m_pShellListView->Populate(pEnumIDList))
         {
            //m_pShellListView->Sort(CompareItems, (LPARAM) this);
                HWND hwndLV = *m_pShellListView;
                int x, y, iCount = ListView_GetItemCount(hwndLV);
                for (int j=0; j                 {
                        x = 48 * (j % 3) + 22 * (j % 3) + 40;
                        y = 74 * (j / 3) + 16 * (j / 3) + 40;
                        ListView_SetItemPosition(hwndLV, j, x, y);
                }

            ListView_SetItemState(*m_pShellListView, 0, LVIS_FOCUSED, LVIS_FOCUSED);
         }
         m_pShellListView->SetRedraw(TRUE);
         pEnumIDList->Release();

         UpdateStatusBar(NULL, 0, FALSE);
      }
   }
   else
   {
      hr = E_FAIL;
   }

   m_uState &= ~IN_REFRESH;

leave:
   return hr;
}
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

9
 
HWND hwndLV = *m_pShellListView;转来做什么,会不会这个引起的?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
在模拟器上按F5刷新下,图标就排列正常了
但在程序里多调用次Refresh()并不起作用
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
在这句话后

m_pShellListView->SetRedraw(TRUE);

调用重绘函数试试
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 10 楼 ilovedrv 的回复:
在这句话后

m_pShellListView->SetRedraw(TRUE);

调用重绘函数试试



这后面加了:
        ListView_RedrawItems(*m_pShellListView, 0, ListView_GetItemCount(*m_pShellListView) - 1);
        UpdateWindow(*m_pShellListView);

还是不行。在这后面打印出来各个item的坐标也不对。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
恩,那你在这段代码

  1.    m_pShellListView->SetRedraw(FALSE);
  2.         if (m_pShellListView->Populate(pEnumIDList))
  3.         {
  4.             //m_pShellListView->Sort(CompareItems, (LPARAM) this);
  5.                 HWND hwndLV = *m_pShellListView;
  6.                 int x, y, iCount = ListView_GetItemCount(hwndLV);
  7. for (int j=0; j
  8. {
  9. x = 48 * (j % 3) + 22 * (j % 3) + 40;
  10. y = 74 * (j / 3) + 16 * (j / 3) + 40;
  11. ListView_SetItemPosition(hwndLV, j, x, y);
  12. }
  13.             ListView_SetItemState(*m_pShellListView, 0, LVIS_FOCUSED, LVIS_FOCUSED);
  14.         }
  15.         m_pShellListView->SetRedraw(TRUE);
  16.         pEnumIDList->Release();

  17.         UpdateStatusBar(NULL, 0, FALSE);
复制代码


里面调试下,是否ListView_SetItemPosition成功,另外获取下坐标,看看是否真正成功
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

14
 
ListView_SetItemPosition后马上取出坐标是对的
m_pShellListView->SetRedraw(TRUE); 之后取出的坐标不对

发现m_pShellListView->Sort()是成功的
就是不按设定的坐标画界面:(
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
在m_pShellListView->SetRedraw(TRUE);之前增加
        if (m_pShellListView->IsAutoArrangeEnabled())
        {
            m_pShellListView->ToggleAutoArrange(FALSE);
        }

还是没用。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表